设计模式——抽象工厂模式

156 阅读3分钟

抽象工厂模式

工厂方法模式和抽象工厂模式不好分清楚,他们的区别如下:

(1) 工厂方法模式:

    a.一个抽象产品类,可以派生出多个具体产品类。 
    
    b.一个抽象工厂类,可以派生出多个具体工厂类。  
    
    c.每个具体工厂类只能创建一个具体产品类的实例。

(2) 抽象工厂模式:

    a.多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。   
    
    b.一个抽象工厂类,可以派生出多个具体工厂类。   
    
    c.每个具体工厂类可以创建多个具体产品类的实例,也就是创建的是一个产品线下的多个产品。   
        
(3) 区别:

    a.工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
    
    b.工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
    
    c.工厂方法创建"一种"产品,他的着重点在于"怎么创建",也就是说如果你开发,你的大量代码很可能围绕着这种产品的构造,初始化这些细节上面。也因为如此,类似的产品之间有很多可以复用的特征,所以会和模版方法相随。 

    d.抽象工厂需要创建一些列产品,着重点在于"创建哪些"产品上,也就是说,如果你开发,你的主要任务是划分不同差异的产品线,并且尽量保持每条产品线接口一致,从而可以从同一个抽象工厂继承。




对于java来说,你能见到的大部分抽象工厂模式都是这样的:---它的里面是一堆工厂方法,每个工厂方法返回某种类型的对象。

比如说工厂可以生产鼠标和键盘。那么抽象工厂的实现类(它的某个具体子类)的对象都可以生产鼠标和键盘,但可能工厂A生产的是罗技的键盘和鼠标,工厂B是微软的。

这样AB就是工厂,对应于抽象工厂;每个工厂生产的鼠标和键盘就是产品,对应于工厂方法;

用了工厂方法模式,你替换生成键盘的工厂方法,就可以把键盘从罗技换到微软。但是用了抽象工厂模式,你只要换家工厂,就可以同时替换鼠标和键盘一套。如果你要的产品有几十个,当然用抽象工厂模式一次替换全部最方便(这个工厂会替你用相应的工厂方法)

所以说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。

写在最后

现在好好理解下工厂模式的定义:

    Factory Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类。
    
    当一个类无法预料要创建哪种类的对象或是一个类需要由子类来指定创建的对象时我们就需要用到Factory。 

小思考?

在学习了设计模式之工厂模式后,大家有没有思考过

    1、为什么要用工厂模式?换句话说,工厂模式有什么好处呢?
    
    2、工厂模式用于什么场合呢?

欢迎大家留言讨论这个问题。