1、设计模式之--简单工厂模式
角色:用户,工厂,产品.
目的是使得用户将产品的消费和生产分开.在编程中就是将类的创建和使用分开.从而达到责任分离,其实这也是所有创建模式的目的之一.做法是工
厂类根据用户的要求(参数)来返回不同的类的实例.
工厂实现:采用参数化的静态方法为用户提供类实例的创建,如下所示:
public static ProductType FactoryMethod(参数)
{
根据参数返回需要类的实例.
}
简单工厂有几种情况:
1.产品只有一种,这种情况下方法没必要带参数.
2.产品有多种,且属于同类型产品,则可以加入抽象产品.加入抽象产品的一个潜在好处是可以让用户可以不关心具体的产品,在设计和实现上可以做
到一定程度上的延后联编.
3.产品有多种,且类型各异,则可以考虑采用其它模式或者提供多个工厂方法来实现.但不鼓励采用后者来实现(做事要专业).
4.在实际应用中产品角色,工厂角色以及用户角色都可以根据实际情况合并.(模式变形)
简单工厂模式的理解:
1.如果产品创建的时候需要用户提供指导,则简单工厂模式不适合,如果要适用就会使得工厂方法的参数过于复杂,因此本模式只适合用户不关心产品
构造逻辑,只关心使用的情况下(不关心构建,只关心使用).
2.大多数情况下用户还是必须知道产品的具体细节,没有减少对细节的依赖(特殊情况,有抽象产品的情况下,在某些应用中可以减少对具体产品的细
节依赖).
3.采用静态方法实现类的创建,好处是可以减少工厂类本身的创建,但缺点是失去了工厂类进行继承扩展的优点.
4.简单工厂模式的好处是实现了责任分离,对用户来讲同时也隐藏了构建产品的细节,而且实现起来比较简单.
5.增加产品的时候,工厂类需要修改,也违背了面向对象的开放封闭原则.
6.只适合产品类比较少的情况,如果产品类太多,会使得静态工厂方法过于庞大.
但现在有一种比较简单的办法,就是采用反射或者泛型来规避静态方法过多而使得工厂类庞大的问题.
2、设计模式之-工厂方法模式
从简单工厂模式我们可以看出,在简单工厂模式中,增加新的产品类,是需要修改工厂类的,这不符合开放-封闭原则.而且在写工厂
类的时候必须知道具体产品类的细节.也不符合由上相下的设计原则,如果要延后关注细节,则必须利用继承或者接口的技术来实
现.将简单工厂模式中的工厂抽象,增加抽象工厂角色,这样用户,抽象工厂,抽象产品,用户就形成了最顶层的设计层面,具体的实现
由具体的工厂来创建具体的产品.着就是工厂方法模式.
工厂方法模式角色:用户,抽象工厂,抽象产品,具体工厂,具体产品.
工厂方法模式采用一个具体工厂生产一种具体产品的方式进行产品的创建.用户具体要创建那种产品的选择逻辑推给了用户,用
户通过选择不同的具体工厂来实现不同产品的创建选择.
工厂方法的优点:
1.符合开放封闭原则,因为增加新的产品不需要修改原来已有的工厂类,只需要增加相应的工厂即可.
2.将使用和创建的责任分开.
3.符合设计的先抽象后具体的顺序.
缺点:
1.如果产品类太多会导致增加很多的类,会使系统显得很不简洁.
2.如果将选择逻辑交给用户,则在一定程度上增加了用户对细节的依赖;
3.与简单工厂模式相比,增加了工厂本身的创建开销.
4.用户需要创建工厂类本身.(通过一定的方法可以将工厂类的创建委托给抽象类去完成.见例子.
抽象工厂方法是工厂方法更一般的表达,工厂方法可以针对产品族(如控件的 Windows 族控件,Unix 族控件),如果只有一族产品
(比如只有 Windows 族)则就退化成简单工厂方法(如果除掉抽象工厂,将工厂方法变为静态的方法,利用参数化减少工厂方法数量