老王讲设计模式(六)——抽象工厂模式
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和奔驰的轿车也是一个产品族。每一个汽车品牌都可以看成一个产品族。所以,刚才我说一个产品族都存在一定的联系。就是这个原因。”
小蔡说:“我有点懵,我需要时间反应反应。”
老王说:“这是正常的,抽象工厂是比较难以理解一点,不过没关系,等我回来,我们再细聊,现在就先让疑惑存在这里。也许我还没到公司,你就想通了。也说不一定。”
老王/小蔡求打赏更多内容,正在赶来,敬请关注“老王的互联网杂谈”。