工厂方法模式与抽象工厂模式

个人理解:
    简单工厂:是静态工厂,由它创建类,大多都是通过传参的方式。如果这个工厂要创建新的对象,那么它就要改代码。
    工厂方法:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法把实例化推迟到子类。这样的好处是再添加新的对象的时候,就不用再改代码了,代码的可扩展性强了。要做的就是:子类工厂继承或实现抽象的工厂,写一个新的创建类的工厂,然后再在客户端调用即可,不需要修改原来的代码。
    如果要添加很多子类怎么办呢?如果用工厂方法就得一个一个的添,如果创建的是一个产品族(有关系的一类产品:比如我有一个产品)。使用工厂方法的工作量就太大了,那么就需要用到抽象工厂了。
    抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体定。抽象工厂允许客户使用抽象确有工厂创建一组相关的产品,而不需要(或关心)实际产出的具体产品是什么。这样一样,客户就从具体的产品中被解耦。

    
创造型模式 - 工厂模式模式
概述:
    工厂模式在《Java与模式》中分为三类:
    1)简单工厂模式(Simple Factory): 简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。
        简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。
    2)工厂方法模式(Factory Method): 工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。
    Define an interface for creating an object,but let the subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses  翻译,"定义一个创建对象的接口,但是让子类来觉得该实例化那个类。工厂方法让一个类推迟实例化至它的子类中。"
    3)抽象工厂模式(Abstract Factory): 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。
    Provide an interface for creating families of related or dependent objects without specifying their concrete classes
    翻译,"为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类"。

    
    这三种模式从上到下逐步抽象,并且更具一般性。
    GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(FactoryMethod)与抽象工厂模式(Abstract Factory)。将简单工厂模式(SimpleFactory)看为工厂方法模式的一种特例,两者归为一类。

简单工厂、工厂方法和抽象工厂模式的比较
    1、简单工厂、工厂方法和抽象工厂都是负责创建对象。它们的功能都实现了:把客户从所使用的具体产品中解耦。
    2、抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
    3、工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式, 把核心放在一个实类上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来, 从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。     
    4、工厂方法使用的是继承/实现接口。利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。通过子类来创建对象。
    5、抽象工厂:提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。要使用这个工厂,必须先实例化它,然后将它传入一些针对抽象类型所写的代码中。一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。    
    6、抽象工厂如果加入新的产品,就要改变接口。
    7、工厂方法潜伏在抽象工厂里面。抽象工厂经常以工厂方法的方法实现。抽象工厂 的任务是定义一个负责创建一组产品的接口。这个接口内的每一个方法都负责创建一个具体的产品,同时我们利用实现抽象工厂的子类来提供这些具体的做法。            

    工厂方法模式                                                                 抽象工厂模式
针对的是一个产品等级结构                                     针对的是面向多个产品等级结构
一个抽象产品类                                                     多个抽象产品类
可以派生出多个具体产品类                                     每个抽象产品类可以派生出多个具体产品类
一个抽象工厂类,可以派生出多个具体工厂类         一个抽象工厂类,可以派生出多个具体工厂类
每个具体工厂类只能创建一个具体产品类的实例     每个具体工厂类可以创建多个具体产品类的实例

工厂模式的应用场景
    当需要创建产品家族和相让制造的相关产品集合起来时,你可以使用抽象工厂。
    当需要需要把客户代码从需要实例化的具体类中解耦,或者目前还不知道将来需要实例化哪些具体类时,可用工厂方法。使用工厂方法,只需要继承/实现的子类,并实现父类的工厂方法、即可。
工厂方法模式的适用环境
1、一个类不知道它所需要的对象的类:
客户端不需要知道具体产品类的类名,只需要知道对应的工厂即可,具体的产品的对象由具体的工厂类创建;客户端需要知道创建具体产品的工厂类。
2、一个类通过其子类来指定创建哪个对象
3、将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件中或数据库中。
抽象工厂模式适用环境
1、一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
2、系统中有多于一个的产品族,而每次只使用其中某一产品族。
3、属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
4、系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

UML结构图

工厂方法:

抽象工厂:

工厂模式的优缺点
    抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
    当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
    增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
    
    抽象工厂如果加入新的产品,就要改变接口。
    

工厂模式的应用实例

    没有找到

代码(其实读UML图要比代码还要一目了然)
http://blog.csdn.net/liruikqn/article/details/12885491

http://blog.csdn.net/liruikqn/article/details/12888511


工厂模式要点:
    1、所有的工厂都是用来封闭对象的创建。
    2、简单工厂,虽然不是真正的设计模式,但仍不失为一个简单的方法,可以将客户程序从具体类解耦。
    3、工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象。
    4、抽象工厂使用对象组合:对象的创建被实现工厂接口所暴露出来的方法中。
    5、所有工厂模式都通过减少应用程序和具体类之间的依赖促进松散耦合。
    6、工厂方法允许类将实例方化延迟到子类进行。
    7、抽象工厂创建相关的对象家族,而不需要依赖它的具体类。
    8、依赖倒置原则,避免我们依赖具体类型,而要尽量依赖抽象。

    9、工厂是很有威力的技巧,帮助我们针对抽象编程,而不要针对具体类编程。


所有模式

     创建型模式,共五种:工厂方法模式、抽象工厂模式单例模式建造者模式原型模式
结构型模式,共七种:适配器模式装饰器模式代理模式外观模式桥接模式组合模式享元模式
    行为型模式,共十一种:策略模式模板方法模式观察者模式迭代子模式责任链模式命令模式备忘录模式状态模式访问者模式中介者模式解释器模式
    补充模式:空对象模式


参考/转自

    《headfirst设计模式》
    http://blog.csdn.net/liruikqn/article/details/12885491
    http://blog.csdn.net/liruikqn/article/details/12888511
    http://blog.csdn.net/tayanxunhua/article/details/8245900
    http://blog.csdn.net/tayanxunhua/article/details/8245900


转载请注明:http://blog.csdn.net/paincupid/article/details/43803497


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值