首页 > 代码库 > 【设计模式】三大工厂家族

【设计模式】三大工厂家族

一、简单工厂模式

简单工厂简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承  自一个父类或接口)的实例。

优点:简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,   对于客户端来说,去除了与具体产品的依赖。

缺点由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类   中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

UML类图:

技术分享

类图分析:

Creator:工厂角色,它是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

Product:抽象产品角色,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

Concrete Product:具体产品角色,它是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

举例1:以C#为例,使用简单工厂模式实现加减乘除运算。

UML类图如图所示:

技术分享

例1分析:如果要增加各种复杂运算,比如平方根等,需要添加相应的运算子类,再修改运算类工厂。并且实现了界面的具体运算子类的依赖。缺点:当增加运算种类是,需修改运算工厂类,违背了封闭-开放原则。



二、工厂方法模式

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到  其子类。

优点:完全实现了封闭-开放原则。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品   生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次            对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应   的产品。

缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。

UML类图:

技术分享

Product:抽象产品角色,定义工厂方法所创建的对象的接口。

ConcreteProduct:具体产品,实现了Product接口。

Creator:声明工厂方法,该方法返回一个Product类型的对象。

ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。


11运用工厂方法模式实现加减乘除运算器的功能

UML如图

技术分享



三、抽象工厂模式

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

优点:易于交换产品系列。让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具   体类名也被具体的工厂的实现分离,不会出现在客户代码中。

缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

 

UML类图:

技术分享

UML类图分析:

AbstractProductA和AbstractProductB是两个抽象产品。而ProductA1、ProductA2和ProductB1、ProductB2就是两个抽象产品的具体分类的实现。

AbstractFactory是一个抽象工厂接口,它里面包含所有的产品创建的抽象方法。而ConcreteFactory1和ConcreteFactory2是具体的工厂。


一句话总结简单工厂vs工厂方法:

工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了它的缺点,完全符合封闭开放原则。




【设计模式】三大工厂家族