设计模式之工厂方法模式

anticipate 预料 = except
ant蚂蚁 ic ic卡 ip ip卡 ate吃
我没有预料到小蚂蚁把我的ic,ip卡吃掉了。
robust 强壮的 = strong
ro rong容祖儿  bu不  st石头
容祖儿不喜欢强壮的石头。
maintain 维持 = keep
main主要的(大陆)  tain 台湾
大陆和台湾维持着若即若离的关系。
设计模式之工厂方法模式

动机:
    一个工厂方法factory method定义了一个接口来创建对象,但是让子类去选择创建哪一个,在运行时创建。一个关于factory method的简单生活例子就是宾馆。进入酒店首先你要登记,前台会在你付钱后给你房间的钥匙,这种方式你可以看做room factory。当你待在宾馆,你肯能需要打电话,你叫前台,前台帮你拨打你要打的号码,就是phone-call factory,因为前台控制着电话的访问。
目的:        定义一个接口来创建对象,但是让子类去决定实例化哪一个种。
实现:
上图的类:--Product:                    定义了factory method创建的对象接口
--Concrete Product:    实现Product接口
--Creator :                   声明factory method方法,返回一个Product类,可能调用抽象mehtod来创建                                Product对象
--Concrete Creator:      重写抽象方法来创想具体的Product类
public interface Product {  }
public abstract class Creator 
{
    public void anOperation() 
    {
        Product product = factoryMethod();
    }
    protected abstract Product factoryMethod();
}
public class ConcreteProduct implements Product {  }
public class ConcreteCreator extends Creator 
{
    protected Product factoryMethod() 
    {
        return new ConcreteProduct();
    }
}
public class Client 
{
    public static void main( String arg[] ) 
    {
        Creator creator = new ConcreteCreator();
        creator.anOperation();
    }
}
应用举例:        实现工厂方法factory method的需求是频繁的,如下情况:当一个类不知道它要创建的类型。当一个类想要子类去详细说明一个新的类型。
Example 1:
        考虑一个桌面应用。很多地方要用到文档。一个桌面应用包括一些操作,例如:打开,创建,保存文档。基本类用来抽象,命名应用和文档。客户端不得不使用它们去创建子类来定义它们自己的应用和文档。比如生成一个绘画应用,需要定义绘画应用drawingApplication和绘画文档drawingDocument类,这些应用类的任务是管理文档类,从客户端接收请求去处理(比如从菜单中接收打开或者保存命令)。
        由于文档类需要被应用类实例化,应用类不知道文档的类型,但是它知道什么时候去实例化。这个框架需要去实例化具体的文档类,但是它仅仅知道不能实例化的抽象类。
        Factory method模式通过把所有的信息给需要实例化文档类对象,在框架外部使用文档类对象的类,正如下面我们看到的:
        在这个application class应用类,CreateDocument方法或者有一个默认的实现,或者不实现,让子类MyApplication去创造一个MyDocument
public Document CreateDocument(String type){
    if (type.isEqual("html"))
        return new HtmlDocument();
    if (type.isEqual("proprietary"))
        return new MyDocument();
    if (type.isEqual("pdf"))
        return new PdfDocument ();
}
CreateDocument()方法将会被MyApplication继承,所以它会实例化一个MyDocument对象。我们称CreateDocument()为Factory method工厂方法,因为它负责去创建一个对象。通过这个方法去重新定义一个Appliction的子类,从这一点来看Factory method模式,这个模式符合依赖反转选择。
问题及解决方案:使用Factory method模式有一些问题:
定义Creator class
        如果我们在已经写好的代码上去应用Factory method模式,可能有两种情况:
1、Creator类是抽象的,generating方法没有任何实现,这种情况,ConcreteCreator具体的creator类必须重定义。
2、Creator类是具体的,generating方法有一个默认的实现,如果是这样,ConcreteCreator将使用默认的实现,而不是继承。
    Factory method只是工厂模式的一个特殊例子,在现代编程语言里面,使用注册器registration的工厂模式使用的更多。
坏处和好处:好处:
1、分割应用和类,在应用中用弱连接代替强连接,这样可以简单的方法和最小的改变去扩展Product
2、提供个性化的钩子,当一个对象直接在类里面被创建,很难被继承它的对象去代替。使用工厂模式就很轻易的代替原始的对象。
坏处:工厂模式被具有family特性,可继承的类使用,如果类没有相同的基础类或继承,就不能使用工厂模式。
热点:        工厂模式是广泛使用的模式,也是更强壮的设计模式之一,当你使用factory method的时候,有一些地方需要考虑:
        考虑你确实需要工厂模式去创建对象。也许使用工厂模式会带来没必要的复杂。不管怎样,如果你有很多类有共同的基本类型,并且你把他们当做抽象类来操作,你需要使用工厂模式。如果你有很多如下的代码,好好考虑他们:
if (genericProduct typeof ConcreteProduct)
    ((ConcreteProduct)genericProduct).doSomeConcreteOperation();
时间: 2024-10-14 10:14:14

设计模式之工厂方法模式的相关文章

每天一个设计模式-5 工厂方法模式

每天一个设计模式-5 工厂方法模式 1.模式定义 定义一个用于创建对象的接口,让子类决定实例化那一个类,Factory Method使一个类的实例化延迟到其子类. 2.工厂方法模式解决问题的思路 工厂方法模式需要接口对象,那就定义一个方法来创建这个接口对象(工厂方法):可是事实上它自己是不知道如何创建这个接口对象的,没有关系,定义成抽象方法让子类来实现就可以了:这样这个对象本身就可以只是面向接口编程,而无需关心到底如何创建接口对象了. 3.实际问题 实现一个导出数据的功能,客户选择数据的导出格式

C#设计模式(3)——工厂方法模式

一.概念:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 二.代码实现 namespace 设计模式之工厂方法模式 { /// <summary> /// 菜抽象类 /// </summary> public abstract class Food { // 输出点了什么菜 public abstract void Print(); } /// <summary> /// 西红柿炒鸡蛋这道菜 /// </summary

03.设计模式_工厂方法模式

转载自:http://www.cnblogs.com/zhili/p/FactoryMethod.html 一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是--简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂模式是如何解决该问题的. 二.工厂方法模式的实现 工厂方法模式之所以可以解决简单工厂的模式,是因为它的实现把具体产品的创建推迟到子类中,此时

Java设计模式之工厂方法模式(转) 实现是抽象工厂?

Java设计模式之工厂方法模式 责任编辑:覃里作者:Java研究组织   2009-02-25   来源:IT168网站 文本Tag: 设计模式 Java [IT168 技术文章]          一 .工厂方法(Factory Method)模式 工厂方法模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中.核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色

【设计模式】——工厂方法模式

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使用一个类的实例化延迟到其子类.根据依赖倒转原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法.然后,所有的要生产具体类的工厂,就去实现这个接口,这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生成对象的工厂.我们在要增加新的功能,就不需要更改原有的工厂类了,只需要增加此功能的运算类和相应的工厂类就可以了.这样整个工厂和产品系其实都没有修改的

【大话设计模式】—— 工厂方法模式

一.概念 想象一下我们的寻常见到的工厂,下一个订单,付了订金,一段时间后就能够提货.我们不须要知道工厂是用的什么机器,怎么安排工人的,从哪来的材料,只须要一个订单就好,工厂就能够依照其固定流水线做出我们所须要的产品.设计模式中也有类似的一个大神:工厂方法模式. 以下让我们来认识一下: 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 二.UML图 Product(抽象产品) ConcreteProduct(

设计模式【工厂方法模式】

本文介绍设计模式中的[工厂模式].首先介绍工厂模式的作用,工厂模式主要是为创建对象提供过度接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 其中一些资料会将工厂模式,分为三类,这三类的分类为: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Method) 3. 抽象工厂模式(Abstract Factory) 但是某些资料会将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类.所以分为:工厂方法模式(F

java设计模式:工厂方法模式(Factory Method)

工厂方法模式 返回设计模式目录 阅读目录: 简单工厂模式 介绍 UML类图 参考代码 总结 工厂方法模式 介绍 UML类图 参考代码 总结 前言: <大话设计模式>里有一小节叫'活字印刷,面向对象'的,讲了一个小故事,大意如下: 话说三国时期,曹操带领大军驻扎于赤壁.军船相连,气势恢宏,眼看要灭掉东吴,统一天下,曹操甚悦,于是大宴群臣.席间曹操诗兴大发,不觉吟道:"喝酒唱歌,人生真爽.--".众文武齐呼:"丞相好诗!".于是一臣子速命印刷工匠刻板印刷,以

Java设计模式之工厂方法模式

工厂方法模式介绍 有时候,由于产品的多样化,但是产品的功能却有某种共同的联系.我们希望定义一个用于创建产品对象的公共接口,让子类决定去如何实现这个功能.然后,我们定义一个生产产品的"工厂",所有的产品将从这个工厂里面生产出来,这样我们就使得产品的构造的细节与工厂分离了,这样产品的实现细节就被封装起来了,并且产品的可扩展性也很强.那么,这种设计模式我们称为工厂方法模式.具体的实例有很多,比如说去年的某一阵子脸萌软件爆红,其中就运用到了工厂方法模式来给用户生产各种脸型. 工厂方法模式分类