java吧 关注:1,262,413贴子:12,762,364
  • 22回复贴,共1

请教吧里兄弟一个问题 抽象工厂和普通工厂的区别在哪里

只看楼主收藏回复

希望可以通过代码来 告诉我 谢谢
以下是我找到的代码
[java] view plaincopy
public interface Sender {
public void Send();
}
两个实现类:
[java] view plaincopy
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
[java] view plaincopy
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
两个工厂类:
[java] view plaincopy
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
[java] view plaincopy
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
在提供一个接口:
[java] view plaincopy
public interface Provider {
public Sender produce();
}
测试类:
[java] view plaincopy
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}


IP属地:广东1楼2016-08-22 14:03回复
    两个工厂类 实现同一个接口 这是我 看到的 和普通的 不一样的地方 这样做是为了?


    IP属地:广东2楼2016-08-22 14:04
    回复
      2025-06-03 12:33:03
      广告
      = =没人吗


      IP属地:广东3楼2016-08-22 14:07
      回复
        通俗一点讲,抽象是为了工厂的适应性,一般我们都喜欢活的东西,不喜欢死的东西. 而把代码写死的工厂叫做普通的,写活的叫抽象的. 当你把工厂写成活的,不管传进去的是啥,只要它符合你的标准就可以起效.
        用一个例子来说, 如果工厂的方法参数是一个动物类,如果你手里有猫和狗两个类,都继承自动物类,那么当你把猫和狗传进这个工厂后,由于猫和狗都有动物的特质,所以都可以运行.这一切都得益于java一种叫做向上转型的机制.子类实参可以适应父类形参,而在代码执行的时候,子类重写父类的方法都会覆盖父类原有的方法.所以实际上虽然猫和狗都是动物,但是它们传进去后,表现出来的行为将会是猫和狗的行为而非动物的行为.


        5楼2016-08-22 14:29
        收起回复
          楼主这个似乎不是抽象工厂吧,应该是工厂方法模式的。
          你说的普通工厂是简单工厂吗,简单工厂所有的判断和实例化对象,都在同一个类里呀,如果一个对象的实例化特别复杂,然后一堆if else就很蛋疼了。
          但是如果用这个工厂方法模式,像楼主写的
          Provider provider = new SendMailFactory();
          那么如果需要换一个产品,那么久要换一个工厂,那么用到这里的SendMailFactory可能全部要改。和什么工厂都不用,似乎也没啥区别呀?求大神


          IP属地:湖北6楼2016-08-22 15:07
          收起回复
            想问一下大神
            Provider provider = new SendMailFactory();
            和直接
            Sender sender=new MailSender()有何区别。


            IP属地:湖北7楼2016-08-22 15:09
            收起回复