互联网从业者的日常程序员iOS技术点

老王讲设计模式(六)——抽象工厂模式

2017-03-02  本文已影响484人  大树林里的小树

抽象工厂模式是使用一个超级工厂创建其他工厂。可以理解为是创造工厂的工厂。

抽象工厂模式-主图镇楼

铃铃铃~~~~~

一阵急促的电话铃声响起,老王从宾馆床上一蹦而起,接起电话问:“喂,你好,请问是哪位?”

“你死哪儿去了?我的电话号码都没存么?”电话那头传来了小蔡的声音。

老王无奈的叹了口气,说:“最近一听电话就紧张,总以为是客户来的电话,所以没有看手机屏幕。”

小蔡说:“那这次出差什么时候回来?你还欠我抽象工厂模式呢”

老王说:“明天就回了。今天把事儿弄完了。正好现在没事儿,要不,我们屏幕分享,我给你远程讲一讲吧”

小蔡问:“你那儿忙完了么?不休息休息?”

老王说:“凌晨的火车,本来就没打算现在休息,等着上了火车再说。”

小蔡说:“那好吧,你远程教我吧”

于是老王打开Eclipse,在电脑上编写起抽象工厂模式的代码来,代码如下:

//定义一个产品接口,描述SUV这种车型
public interface ISUV { 
  //汽车总是有商标的 
  public void logo();  
}  

//定义另一个产品接口,描述轿车这种车型
public interface ICar {  
  public void logo(); 
}  

//宝马X6,是一种SUV
public class BMW_X6 implements ISUV {  
  public void logo() {  
    System.out.println("This is X6");  
  }  
}  

//宝马750,是一种轿车
public class BMW_750 implements ICar {  
  public void logo() {  
    System.out.println("This is 750");  
  }  
}  

//宝马准备建一个工厂,
//首先出一个设计图
//这个设计图考虑到这个工厂既能生产SUV,又能生产轿车
//于是有了下面这个抽象工厂,此时工厂只是设计图,还没具体建造
public abstract class BMWFactory {  
  public abstract ISUV createX6();  
  public abstract ICar create750();  
}  

//根据设计图,把制造SUV的流水线搬进去,就是一个SUV工厂
public class SUVFactory extends BMWFactory{  
  public ISUV createX6() {  
    return new BMW_X6();  
  }  
  public ICar create750() {  
    return null;  
  }  
}  

//根据设计图,把制造轿车的流水线搬进去,就是一个轿车工厂
public class CarFactory extends BMWFactory{  
  public ISUV createX6() {  
    return null;  
  }  
  public ICar create750() {  
    return new BMW_750();  
  }  
} 

//工厂建造者,负责建造工厂
//他们根据命令,运算不同的流水线到工厂里
public class FactoryProducer {
  public static BMWFactory getFactory(String choice){
    if(choice.equalsIgnoreCase("SUV")){
      return new SUVFactory();
    } else if(choice.equalsIgnoreCase("Car")){
      return new CarFactory();
    }
    return null;
  }
}

//老板负责发命令造车
public class Boss {  
  public static void main(String[] args){  
    //老板得了一块地,说造个轿车工厂吧
    BMWFactory factory = FactoryProducer.getFactory("Car"); 
    //于是有了宝马750轿车 
    factory.create750().logo();  

    //老板说,把这工厂重建为SUV工厂吧
    factory = FactoryProducer.getFactory("SUV"); 
    //于是有了宝马X6 
    factory.createX6().logo();   
  }  
}  

老王打完这一堆代码后,看到小蔡发来一条信息:“看上去,听厉害的,制造工厂的工厂,但是这样复杂的工厂,有什么优势呢?”

老王说:“抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。”

小蔡问:“什么叫产品族呢?”

老王说:“宝马汽车就是一个产品族啊,奔驰的SUV和奔驰的轿车也是一个产品族。每一个汽车品牌都可以看成一个产品族。所以,刚才我说一个产品族都存在一定的联系。就是这个原因。”

小蔡说:“我有点懵,我需要时间反应反应。”

老王说:“这是正常的,抽象工厂是比较难以理解一点,不过没关系,等我回来,我们再细聊,现在就先让疑惑存在这里。也许我还没到公司,你就想通了。也说不一定。”

老王/小蔡求打赏

更多内容,正在赶来,敬请关注“老王的互联网杂谈”。

上一篇下一篇

猜你喜欢

热点阅读