设计模式之工厂方法模式
工厂方法模式1 工厂方法模式的引入——简单工厂模式的不足在《设计模式之简单工厂模式》一文中,提到简单工厂模式:1)只提供了一个工厂类,该工厂类知道每一个产品对象的创建细节;2)当有新产品要加入时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”,也是其最大的缺点。3)工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,影响系统的灵活性和扩展性。因此,引入工厂方法模式。2 模式动机 如果需要增加一种新类型的按钮,那么除了增加一个新的具体产品类之外,还需要修改工厂类的代码,这就使得整个设计在一定程度上违反了“开闭原则”。 针对上述这一问题,定义一个抽象的按钮工厂类,再定义具体的工厂类来生成圆形按钮、矩形按钮、菱形按钮等,它们实现在抽象按钮工厂类中定义的方法。因此,可以在不修改具体工厂类的情况下引进新的产品,更加符合“开闭原则”。3 模式意图
工厂方法(Factory Method)模式,又称为虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式。
其模式意图是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 具体体现为:工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象。即通过工厂子类来确定究竟应该实例化哪一个具体产品类。4 模式结构定义工厂方法所创建对象的接口。
具体产品(类):实现产品接口。生产者:声明工厂方法,该方法返回产品类型的对象。具体生产者:Overrides工厂方法来返回一个具体产品的实例。以在简单工厂模式中的实例来说明工厂方法模式的实现。有如下XML配置文件config.xml:
7 模式扩展1)使用多个工厂方法:在抽象工厂角色中可以定义多个工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以包含不同的业务逻辑,以满足对不同的产品对象的需求。2)产品对象的重复使用:工厂对象将已经创建过的产品保存到一个集合(如数组、List等)中,然后根据客户对产品的请求,对集合进行查询。如果有满足要求的产品对象,就直接将该产品返回客户端;如果集合中没有这样的产品对象,那么就创建一个新的满足要求的产品对象,然后将这个对象在增加到集合中,再返回给客户端。3)多态性的丧失和模式的退化:如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,此时就不再是工厂方法模式了。一般来说,工厂对象应当有一个抽象的父类型,如果工厂等级结构中只有一个具体工厂类的话,抽象工厂就可以省略,也将发生了退化。当只有一个具体工厂,在具体工厂中可以创建所有的产品对象,并且工厂方法设计为静态方法时,工厂方法模式就退化成简单工厂模式。