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

2018/08/12  |  from IT路  |  by 我是真老王  |  浏览 29

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

铃铃铃~~~~~

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

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

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

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

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

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

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

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

于是老王打开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和奔驰的轿车也是一个产品族。每一个汽车品牌都可以看成一个产品族。所以,刚才我说一个产品族都存在一定的联系。就是这个原因。”

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

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