一、简单工厂模式
简单工厂:简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承 自一个父类或接口)的实例。
优点:简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, 对于客户端来说,去除了与具体产品的依赖。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类 中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
UML类图:
类图分析:
Creator:工厂角色,它是简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
Product:抽象产品角色,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
Concrete Product:具体产品角色,它是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
举例1:以C#为例,使用简单工厂模式实现加减乘除运算。
其 UML 类图如图所示:
例1分析:如果要增加各种复杂运算,比如平方根等,需要添加相应的运算子类,再修改运算类工厂。并且实现了界面的具体运算子类的依赖。缺点:当增加运算种类是,需修改运算工厂类,违背了封闭-开放原则。
二、工厂方法模式
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到 其子类。
优点:完全实现了封闭-开放原则。有一个抽象的Factory类(可以是抽象类和接口),这个类将不再负责具体的产品 生产,而是只制定一些规范,具体的生产工作由其子类去完成。在这个模式中,工厂类和产品类往往可以依次 对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应 的产品。
缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。
UML类图:
Product:抽象产品角色,定义工厂方法所创建的对象的接口。
ConcreteProduct:具体产品,实现了Product接口。
Creator:声明工厂方法,该方法返回一个Product类型的对象。
ConcreteCreator:重定义工厂方法以返回一个ConcreteProduct实例。
例1.1运用工厂方法模式实现加减乘除运算器的功能
UML如图
三、抽象工厂模式
抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
优点:易于交换产品系列。让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具 体类名也被具体的工厂的实现分离,不会出现在客户代码中。
缺点:增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
UML类图:
UML类图分析:
AbstractProductA和AbstractProductB是两个抽象产品。而ProductA1、ProductA2和ProductB1、ProductB2就是两个抽象产品的具体分类的实现。
AbstractFactory是一个抽象工厂接口,它里面包含所有的产品创建的抽象方法。而ConcreteFactory1和ConcreteFactory2是具体的工厂。
一句话总结简单工厂vs工厂方法:
工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了它的缺点,完全符合封闭开放原则。