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

时间:2019-10-06 07:52来源:编程技术
厂子方法情势 (Factory MethodPattern)又称为工厂情势,也叫 虚构构造器 ( VirtualConstructor )格局大概多态工厂(PolymorphicFactory)形式,它属于类创制型格局。在工厂方法格局中,工厂父类肩负定

厂子方法情势(Factory Method Pattern)又称为工厂情势,也叫虚构构造器(Virtual Constructor)格局大概多态工厂(Polymorphic Factory)形式,它属于类创制型格局。在工厂方法格局中,工厂父类肩负定义创立产品对象的集体接口,而工厂子类则担负生成具体的产品对象,那样做的目标是将成品类的实例化操作延迟到厂子子类中成就,即透过工厂子类来规定毕竟应该实例化哪一个切实可行产品类。

原来的作品地址:

概念有一点抽象,给大家举个栗子:

介绍 在轻易工厂格局中,大家提到,工厂方法方式是大概工厂方式的贰个延伸,它属于Gof23中设计格局的成立型设计情势。它解决的照样是软件设计中与创设对象有关的主题素材。它能够越来越好的管理顾客的须求转换。

铁匠创制武器。Smart须要Smart的武器,兽人供给兽人的军火。依照分裂的顾客,召唤正确类型的铁匠。

引入 大家继续的话"new"的难题,大家在轻巧工厂格局中,将实例化对象的工作推迟到了非常负担创制对象的厂子类中,那样,在大家事先预感的动静下,能够依照我们的内需动态创设产品类。可是,大家的预见是有限的,客商的浮动或许是极其的。所以,就应时而生了难题,一旦客商的变通超过了我们的预言,大家就务须修改我们的源代码了。那是设计形式所不容许的,怎么办呢?工厂方法形式就是消除此类难点的。 难题:具体育工作厂类的创立专门的学问不可能满意我们的供给了,创造的干活调换了 解决思路:哪个地方变化,封装哪个地方。把实际工厂封装起来。

它提供了一种将实例化逻辑委托给子类的秘诀。

定义 工厂方法形式又称之为工厂格局,也叫设想构造器(Virtual Constructor)格局也许多态工厂情势(Polymorphic Factory),在工厂方法格局中,父类担任定义创制对象的公物接口,而子类则承担生成具体的目的,那样做的目标是将类的实例化操作延迟到子类中达成,即由子类来支配毕竟应该实例化(创造)哪多个类。 工厂格局法形式(Factory Method),定义了一个用以创制对象的接口,让子类决定实例化哪一个类。工厂方法使二个类的实例化延迟到子类。

厂子方法形式包涵如下剧中人物:

意图 定义二个顾客创制对象的接口,让子类决定实例化哪叁个类,工厂方法格局使贰个类的实例化延迟到其子类。

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体育工作厂

参与者 抽象产品剧中人物(Product):定义产品的接口 具体产品角色(ConcreteProduct) :完毕接口Product的实际产品类 抽象工厂剧中人物(Creator) :注明工厂方法(FactoryMethod),再次回到贰个出品 真实的厂子(ConcreteCreator):完成FactoryMethod工厂方法,由顾客调用,重回多个产品的实例 厂子方法格局UML图 澳门金莎娱乐网站 1

在铁匠那三个例子中,军火是空虚产品,Smart的武器和兽人的军械是切实可行产品;铁匠是架空工厂,可以创设具体武器的铁匠是实际工厂。

现实生活中的例子 为了便利大家知道,笔者照旧举穿衣裳方面包车型地铁二个例子。这些事例与简便工厂格局中的那多少个例子有个别分歧。 据他们说南宋有个国君穿衣特其他富华,每一个衣裳(具体产品类)由一宫女(具体工厂类)专责,那样一来,每扩大一种衣裳(具体产品类),将要多出三个宫女(具体育工作厂类),不过她们承受,互不影响。天皇之所以如此做,是因为针对穿衣服这事来讲,可扩展性是不行强的。

以铁匠为例。首先,大家有一个blacksmith接口和它的局地落实

分析 达成的效应:能够依据天子的须求,动态的创建(由宫女去拿)已存在的现实产品(服装),假诺天子的须求太刻薄,这种衣裳还平昔不,只要求扩大叁个宫女,三个衣着就能够满意她的必要了。各个宫女只担负一种服装(高内聚),要扩充一种服装,对于从前的持有宫女与时装来讲,都不会受到震慑(设计情势中所期望的)。谈起这里,是否驾驭了工厂方法格局所能解决的标题及其使用了?呵呵。。你一定在想,比简单工厂格局灵活性高啊。 系统布局 澳门金莎娱乐网站 2 ICoat.cs

public interface Blacksmith { Weapon manufactureWeapon(WeaponType weaponType);}public class ElfBlacksmith implements Blacksmith { public Weapon manufactureWeapon(WeaponType weaponType) { return new ElfWeapon(weaponType); }}public class OrcBlacksmith implements Blacksmith { public Weapon manufactureWeapon(WeaponType weaponType) { return new OrcWeapon(weaponType); }}

澳门金莎娱乐网站 3

以往,随着客户的到来,正确类型的铁匠被召集起来,要求制作火器

namespace FactoryMethod
{
    /// <summary>
    /// 抽象产品类
    /// </summary>
    public interface ICoat
    {
        void ShowCoat();
    }
}
Blacksmith blacksmith = new ElfBlacksmith();blacksmith.manufactureWeapon(WeaponType.SPEAR);blacksmith.manufactureWeapon(WeaponType.AXE);// Elvish weapons are created

澳门金莎娱乐网站 4

符合工厂方法情势的情状:

IFactory.cs

  • 三个类不知晓它所需求的指标的类:在工厂方法格局中,顾客端不供给驾驭具体产品类的类名,只需求精通所对应的厂子就能够,具体的制品对象由具体育工作厂类成立;顾客端必要通晓创制具体产品的厂子类。
  • 澳门金莎娱乐网站,三个类经过其子类来钦定创制哪个目的:在工厂方法格局中,对于肤浅工厂类只须要提供三个创建产品的接口,而由其子类来规定具体要开创的对象,利用面向对象的多态性和里氏代换原则,在程序运营时,子类对象将隐瞒父类对象,进而使得系统更便于扩大。
  • 将成立对象的职务委托给四个厂子子类中的某二个,顾客端在使用时得以不要关怀是哪一个厂子子类创立产品子类,需求时再动态钦定,可将具体育工作厂类的类名存款和储蓄在安插文件或数据库中。

澳门金莎娱乐网站 5

参考:

namespace FactoryMethod
{
    /// <summary>
    /// 抽象工厂类,定义产品的接口
    /// </summary>
    public interface IFactory
    {
        ICoat CreateCoat();
    }
}

图说设计方式...

澳门金莎娱乐网站 6

FashionCoat.cs

澳门金莎娱乐网站 7

using System;

namespace FactoryMethod
{
    /// <summary>
    /// 具体产品类,时尚上衣类
    /// </summary>
    public class FashionCoat :ICoat
    {
        public void ShowCoat()
        {
            Console.WriteLine("这件是时尚上衣");
        }
    }
}

澳门金莎娱乐网站 8

BusinessCoat.cs

澳门金莎娱乐网站 9

using System;

namespace FactoryMethod
{
    /// <summary>
    /// 具体产品类,商务上衣类
    /// </summary>
    public class BusinessCoat :ICoat
    {
        public void ShowCoat()
        {
            Console.WriteLine("这件是商务上衣");
        }
    }
}

澳门金莎娱乐网站 10

FashionFactory.cs

澳门金莎娱乐网站 11

namespace FactoryMethod
{
    /// <summary>
    /// 具体工厂类,用于创建时尚上衣
    /// </summary>
    public class FashionFactory :IFactory
    {
        public ICoat CreateCoat()
        {
            return new FashionCoat();
        }
    }
}

澳门金莎娱乐网站 12

BusinessFactory.cs

澳门金莎娱乐网站 13

namespace FactoryMethod
{
    /// <summary>
    /// 具体工厂类:用于创建商务上衣类
    /// </summary>
    public class BusinessFactory : IFactory
    {
        public ICoat CreateCoat()
        {
            return new BusinessCoat();
        }
    }
}

澳门金莎娱乐网站 14

App.config

澳门金莎娱乐网站 15

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key="FactoryName" value="FashionFactory"/>
    </appSettings>
</configuration>

澳门金莎娱乐网站 16

Program.cs

澳门金莎娱乐网站 17

using System;
using System.Configuration;
using System.Reflection;

namespace FactoryMethod
{
    class Client
    {
        static void Main(string[] args)
        {
            //BusinessFactory factory = new BusinessFactory();
            //为了方便以后修改,将工厂类的类名写在应用程序配置文件中
            string factoryName = ConfigurationManager.AppSettings["FactoryName"];
            IFactory factory = (IFactory)Assembly.Load("FactoryMethod").CreateInstance("FactoryMethod." + factoryName);

            ICoat coat = factory.CreateCoat();
            //显示你要的上衣
            coat.ShowCoat();
            Console.ReadLine();
        }
    }
}

澳门金莎娱乐网站 18

客商端代码要求介怀的多个地点: 1、把具体育工作厂类类名称写在了应用程序配置文件中,方便修改; 2、用到了反光,利用.NET提供的反射能够依据类名来创建它的实例,特别有利。

工厂方法格局的优点 在工厂方法形式中,工厂方法用来创制客商所须求的产品,同一时候还向顾客遮蔽了哪一类具体产品类将被实例化这一细节,顾客只须求关切所需产品对应的厂子,无须关怀创制细节,以致不用知器械体产品类的类名。 基于工厂剧中人物和成品剧中人物的多态性设计是工厂方法情势的严重性。它能够使工厂可以自己作主鲜明成立何种产品对象,而如何创立这些指标的细节则统统封装在切实可行工厂内部。工厂方法格局之所以又被叫做多态工厂形式,是因为拥有的现实工厂类都存有同样抽象父类。 使用工厂方法形式的另一个亮点是在系统中插足新产品时,无须修改抽象工厂和虚幻产品提供的接口,无须修改客商端,也决不修改其余的有血有肉工厂和实际产品,而要是加上八个现实工厂和现实产品就足以了。那样,系统的可扩大性也就变得蛮好,完全适合“开闭原则”。

工厂方法形式的老毛病 在累加新产品时,须要编写制定新的具体产品类,况且还要提供与之对应的有血有肉工厂类,系统中类的个数将成对扩展,在必然水平上加码了系统的复杂度,有更加多的类须求编写翻译和运营,会给系统带来一些附加的开垦。 由于考虑到系统的可扩充性,须要引入抽象层,在顾客端代码中均运用抽象层开展定义,扩大了系统的抽象性和清楚难度,且在落成时也许供给用到DOM、反射等本事,增添了系统的贯彻难度。

格局适用条件 在偏下情况下能够运用工厂方法格局: 三个类不通晓它所急需的靶子的类:在工厂方法形式中,客商端不须要明白具体产品类的类名,只供给驾驭所对应的工厂就能够,具体的出品对象由具体育工作厂类创制;客户端须求了解成立具体产品的工厂类。 叁个类经过其子类来内定创造哪个目的:在工厂方法形式中,对于肤浅工厂类只需求提供八个创办产品的接口,而由其子类来规定具体要创造的对象,利用面向对象的多态性和里氏代换原则,在程序运维时,子类对象将蒙蔽父类对象,进而使得系统更便于增添。 将创造对象的任务委托给三个工厂子类中的某一个,客商端在采取时得以绝不关切是哪八个工厂子类创制产品子类,供给时再动态钦定,可将具体育工作厂类的类名存款和储蓄在配置文件或数据库中。

小结 工厂方法方式又称作工厂方式,它属于类创造型方式。在工厂方法情势中,工厂父类担负定义创设产品对象的公共接口,而工厂子类则肩负生成具体的出品对象,那样做的指标是将产品类的实例化操作延迟到厂子子类中成就,即由此工厂子类来规定终归应该实例化哪一个切实可行产品类。 工厂方法形式蕴涵多少个剧中人物:抽象产品是概念产品的接口,是工厂方法格局所创设对象的超类型,即产品对象的一块儿父类或接口;具体产品完毕了指雁为羹产品接口,某种类型的实际产品由非常的现实工厂成立,它们中间往往一一对应;抽象工厂中扬言了工厂方法,用于重回二个产品,它是工厂方法形式的中坚,任何在形式中创立对象的工厂类都必得贯彻该接口;具体育工作厂是说梅止渴工厂类的子类,完结了画饼充饥工厂中定义的工厂方法,并可由客商调用,重返多个切实可行产品类的实例。 工厂方法情势是轻巧工厂格局的进一步抽象和松手。由于采纳了面向对象的多态性,工厂方法格局保持了简短工厂格局的独到之处,並且制伏了它的劣势。在工厂方法情势中,主旨的工厂类不再承担全体成品的创造,而是将具体创设专门的学业交给子类去做。那一个大旨类仅仅肩负给出具体育工作厂必得兑现的接口,而不承担产品类被实例化这种细节,那使得工厂方法情势可以允许系统在不更换工厂剧中人物的动静下引入新产品。 工厂方法形式的首要优点是充实新的出品类时无须修改现存系统,并封装了产品对象的创办细节,系统有着出色的得心应手和可扩大性;其短处在于增添新产品的还要供给扩大新的厂子,导致系统类的个数成对扩充,在早晚水准上加码了系统的复杂性。 工厂方法方式适用景况蕴涵:二个类不清楚它所须要的目的的类;叁个类经过其子类来内定创制哪个指标;将创造对象的职责委托给八个厂子子类中的某一个,顾客端在采用时得以毫非亲非故注是哪八个工厂子类创立产品子类,须要时再动态钦命。

编辑:编程技术 本文来源:设计模式,设计模式之工厂方法模式

关键词: