原文:C#设计模式之二工厂要领模式(Factory Method Pattern)【创建型】
一、引言
在上一篇文章中我们讲解了过渡的一种模式叫做【简单工厂】,也有叫【静态工厂】的,通过对简单工厂模式得了解,我们也发明了它的错误谬误,就是跟着需求的变革我们要不竭地改削工厂里面的要领的代码,需求变革越多,里面的If--Else--也越多,这样就会造成简单工厂的实现逻辑过于庞大。设计模式是遵循必然原则而得来的,好比,我们要怎么增加代码,怎么改削代码,不是想怎么来就怎么来的,此中一个原则就是OCP原则,中文是【开放*原则】,对增加代码开发,对改削代码*,所以我们就不能总是这样改削简单工厂里面的要领。本章介绍的工厂要领模式可以解决简单工厂模式中存在的这个问题,下面就具体看看工厂要领模式是如何解决该问题的。
二、工厂要领模式的胡介绍
2.1、动机(Motivate)
在软件系统的构建过程中,经常面临着“某个东西”的创建事情:由于需求的变革,这个东西(的具体实现)经常面临着剧烈的变革,但是它却拥有对照不变的接口。
如何应对这种变革?如何供给一种“封装机制”来断绝出“这个易变东西”的变革,从而连结系统中“其他依赖东西的东西”不跟着需求转变而转变?
2.2、意图(Intent)
界说一个用于创建东西的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 --《设计模式》GoF
2.3、布局图(Structure)
2.4、模式的构成
可以看出,在工厂要领模式的布局图有以下角色:
(1)、抽象工厂角色(Creator): 充当抽象工厂角色,界说工厂类所具有的根基的操纵,任何具体工厂都必需担任该抽象类。
(2)、具体工厂角色(ConcreteCreator):充当具体工厂角色,该类必需担任抽象工厂角色,实现抽象工厂界说的要领,用来创建具体产品。
(3)、抽象产品角色(Product):充当抽象产品角色,界说了产品类型所有具有的根基操纵,具体产品必需担任该抽象类。
(4)、具体产品角色(ConcreteProduct):充当具体产品角色,实现抽象产品类对界说的抽象要领,由具体工厂类创建,它们之间有一一对应的关系。
2.5、工厂要领模式的代码实现
【简单工厂模式】的问题是:如果有新的需求就需要改削工厂类里面创建产品东西实例的阿谁要领的实现代码,在面向东西设计一个原则就是哪里有变革,我就封装哪里。还有此外两个大的原则,其一是:面向抽象编程,细节和高层实现都要依赖抽象,第二个原则是:多组合,少担任。这三个原则是最根柢的原则,学习设计模式必需以这三个原则为基点,否则都是枉然。按照这三大原则又衍生出来6个具体的原则,分袂是【单一职责原则】,【里氏替换原则】,【依赖颠倒原则】,【接口断绝原则】、【迪米特法例】和【开闭原则】,既然工厂类有变革,我们就封装它,面向抽象编程,我们先抽象出一个工厂基类,然后,每个需求就实现一个具体的工厂类,这样我们就切合了【开闭原则OCP】,让一个工厂出产一款产品,并一一对应。我们把具体产品的创建推迟到子类中,,此时工厂类(这类是基类了)不再卖力所有产品的创建,而只是给出具体工厂必需实现的接口,这样工厂要领模式就可以允许系统不改削工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中错误谬误。下面就是工厂要领模式的实现代码: