`

[创建型模式]设计模之工厂方法模式(Factory Method Pattern)

 
阅读更多
转自:http://www.cnblogs.com/ejiyuan/archive/2012/06/20/2556418.html
http://www.cnblogs.com/xing901022/p/4044211.html


模式意图
工厂方法在MVC中应用的很广泛。
工厂方法意在分离产品与创建的两个层次,使用户在一个工厂池中可以选择自己想要使用的产品,而忽略其创建过程。
简单来说,就像一个大型的工厂,对于消费者来说,只需要知道都有什么工厂的产品生产出来,而不需要关心工厂是如何生产产品的。对于工厂来说,必须知道所有的产品的制造方法。



适合场景
1 当一个类不知道它所必须创建的对象的类的时候。
2 当一个类希望由他的子类来制定它所创建的对象的时候
3 当类创建对象的职责委托给多个帮助子类中的某一个,并且希望进行一些信息的局部初始化的时候。


问题:
简单工厂模式比较适用于事先已经考虑到的可能出现的算法,来构造工厂类实现,如果需要添加新的类,则就需要改变工厂类了,违反开闭原则,简单的说,简单公共适应与业务变化不是很剧烈的场景下如,审批业务,设计时可以判断到的只有“部门经理审批”,“总裁审批”不会过几天又要加入“组长审批”,去修改工厂类,相对来说变化不是很剧烈的。

在软件设计中经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如果我们使用简单工厂,这样会不断地修改工厂类,应对业务变化,违反开闭原则,另外因为实例化产品的判断逻辑在工厂类中,工厂类会变的越来与臃肿。

定义:
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂模式(Polymorphic Factory),定义一个用户创建对象的接口,让子类决定实例化哪一个类,工厂方法模式使一个类的实例化延迟到其子类。

意图:
定义一个用户创建对象的公共接口,此接口不负责产品的创建不关心产品实例化细节,而是将具体创建工作交给子类去做,这样做的目的是将类的实例化操作延迟到子类中完成,即由子类来决定究竟应该实例化(创建)哪一个类,使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

参与者:
•抽象工厂(Creator)角色:
是工厂方法模式的核心,声明工厂方法(FactoryMethod),返回一个产品。任何在模式中创建的对象的工厂类必须实现这个接口。
•具体工厂(Concrete Creator)角色:
这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,由客户调用,返回一个产品的实例 。
•抽象产品(Product)角色:
工厂方法模式所创建的对象产品的抽象类型。
•具体产品(Concrete Product)角色:
这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。
UML图:




实例说明:

诺基亚手机工厂
比如Nokia手机工厂,现在只生产N8,N9两款手机,如果以后生产N10手机可以不修改现有的生产逻辑可以使用工厂方法,根据不同生产工厂(N8生产车间,N9

生产车间)创建不同的Nokia手机,而且容易加入新型号手机的生产(不修改现有系统)。uml图如下:



/// <summary>
    /// 手机接口
    /// </summary>
    public interface INokiaPhone
    {
        string GetPhoneName();            
    }
    /// <summary>
    /// N8手机具体类
    /// </summary>
    public class N8Phone : INokiaPhone
    {
        public string GetPhoneName()
        {
            return "我是N8";
        }
    }
    /// <summary>
    /// N9手机具体类
    /// </summary>
    public class N9Phone : INokiaPhone
    {
        public string GetPhoneName()
        {
            return "我是N9";
        }
    }
    /// <summary>
    /// 手机抽象工厂类
    /// </summary>
    public interface IPhoneFactory
    {
        INokiaPhone CreateNokiaPhone();
    }
    /// <summary>
    /// N8手机工厂
    /// </summary>
    public class NokiaN8Factory : IPhoneFactory
    {
        public INokiaPhone CreateNokiaPhone()
        {
            return new N8Phone();
        }
    }
    /// <summary>
    /// N9手机工厂
    /// </summary>
    public class NokiaN9Factory : IPhoneFactory
    {
        public INokiaPhone CreateNokiaPhone()
        {
            return new N9Phone();
        }
    }
    /// <summary>
    /// 客户端类
    /// </summary>
    class Program
    {
        void CreatePhone()
        {
            IPhoneFactory factory = new NokiaN8Factory();
            INokiaPhone phone = factory.CreateNokiaPhone();
            phone.GetPhoneName();
        }
    }


优点:

•创建一个具体产品的细节完全封装在具体工厂内部,符合高内聚,低耦合
•在系统中加入新产品时,无需修改抽象工厂和抽象产品提供的接口,符合开闭原则,大大提高系统扩展性

缺点:

•每加入一种新产品都要,创建一个产品的工厂(方法)
•Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),没办法为不同类的类提供一个对象创建的接口

应用情景:
•当一个类需要调用另一个类,但是并不(需要)知道具体要实例化哪一个具体的子类,希望由它的子类来指定它所创建的对象的时候。这里的意思为:假设我们在类A中要使用到类B,B是一个抽象父类,在A中并不知道具体要实例化那一个B的子类,但是在类A的子类D中是可以知道的。在A中我们没有办法直接使用类似于new ×××的语句,因为根本就不知道×××是什么。

•简单工厂模式无法应对业务变化的时候。
分享到:
评论

相关推荐

    创建型模式之工厂方法模式(Factory Method Pattern)

    工厂方法模式是面向对象设计模式中的一个核心模式,属于创建型模式。它的主要目的是通过引入一个工厂接口,将具体的对象创建过程封装起来,使得客户端在使用时无须关心产品类的确切实现,只需要通过工厂来获取所需的...

    设计模式之“工厂方法模式[Factory Method Pattern]”

    今天我们要探讨的是设计模式中的一个经典成员——工厂方法模式(Factory Method Pattern)。工厂方法模式是创建型设计模式的一种,它提供了一种创建对象的最佳方式。 ### 一、什么是工厂方法模式? 工厂方法模式...

    [创建型模式] head first 设计模式之工厂模式(Factory)

    在软件设计领域,工厂模式是一种常用的创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们创建一个工厂类,该类负责创建特定类型的对象,而无需暴露具体的创建逻辑。这样,客户端代码就可以使用...

    c++-深入浅出讲解一下 “工厂方法模式 (Factory Method)”

    工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪一个具体类。这样,客户端代码就不需要知道具体的类是什么,只需通过工厂接口获取对象。 工厂...

    创建型-抽象工厂模式(Abstract Factory)

    此外,抽象工厂模式还可以与其他设计模式结合使用,比如工厂方法模式(Factory Method Pattern),在某些情况下,可以将抽象工厂模式的抽象工厂类设计为工厂方法模式,让子类决定实例化哪一个类。同时,抽象工厂模式...

    23种设计模式 (创建型,结构型,行为型)

    工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10...

    C++设计模式(Design Pattern)范例源代码

    工厂方法模式(Factory Method) 原型模式(Prototype) 单件模式(Singleton) 结构型: 适配器模式(Adapter) 桥接模式(Bridge) 组合模式(Composite) 装饰者模式(Decorator) 外观模式(Facade) 蝇量模式(Flyweight) 代理...

    FactoryMethodPattern.zip

    工厂方法模式是设计模式中的一种创建型模式,它在对象创建过程中抽象了具体的实例化过程,使得客户端可以使用同一接口来创建多种类型的对象,而无需关心具体的实现细节。这种模式在iOS开发中尤为常见,因为它提供了...

    Factory_Method&&Simple_Factory

    工厂方法模式(Factory Method Pattern)是设计模式中的创建型模式之一,主要解决对象创建过程中的复杂性问题。在软件工程中,当一个类不知道它所必须创建的对象的类的时候,它就不会实例化对象,而是使用一个工厂...

    [原创][创建型模式] 简单工厂、工厂方法、抽象工厂三种设计模式的理解

    例如,`FactoryMethodPattern.cpp`和`FactoryMethodPattern.h`可能如下所示: ```cpp class Creator { public: virtual std::unique_ptr&lt;Product&gt; create() = 0; }; class ConcreteCreator1 : public ...

    【Java设计模式-源码】Factory Method Pattern in Java: 使用多态制造增强灵活性

    这种创建型设计模式允许一个类将实例化推迟到子类,增强了代码的灵活性和可维护性。 **四、通过实际示例详细解释Factory Method模式** 实际示例: &gt; 想象一家物流公司需要递送不同类型的包裹:标准、快递和超大...

    设计模式之三种工厂模式

    2. 工厂方法模式(Factory Method Pattern) 工厂方法模式将对象的创建过程延迟到子类,工厂角色由抽象工厂类定义,具体的对象创建由各个具体工厂类实现。这样,当需要添加新产品时,只需要新增一个具体的工厂类,而...

    C#设计模式_设计模式_C#_

    工厂方法模式(Factory Method) 5. 原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式...

    软件设计之工厂方法模式,源代码

    工厂方法模式(Factory Method Pattern)是一种常用的面向对象设计模式,属于创建型模式之一。它提供了一种创建对象的最佳方式。在工厂方法模式中,我们定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。...

    工厂方法模式源文件

    1. **模式定义**:工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂方法模式中,每个创建对象的工厂类都提供了专门的工厂方法用于创建对象,客户端调用这个...

    设计模式PPT

     工厂方法模式(Factory Method Pattern)  抽象工厂模式(Abstract Factory Pattern)  建造者模式(Builder Pattern)  原型模式(Prototype Pattern)  单例模式(Singleton Pattern) 结构型模式用来...

    Simple Factory Pattern.rar【GoF的简单工厂模式(C#源码)】

    简单工厂(Simple Factory)模式又称为静态工厂方法(Static Factory Method)模式,属于类的创建型模式,通常它根据自变量的不同返回不同的类的实例。 简单工厂模式的实质是由一个工厂类根据传入的参量,动态决定...

Global site tag (gtag.js) - Google Analytics