简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式应运而生
工厂方法模式
工厂方法模式(Factory Method Pattern)又叫作多态性工厂模式,指定义一个创建对象的工厂接口,但由实现这个接口的工厂类决定来实例哪个类,工厂方法把类的实例化推迟到子类中。
设计思想
抽象工厂(Factory):声明了工厂方法,用于返回产品。所有创建对象的工厂类必须实现该接口。
具体工厂(ConcreateFactory):抽象工厂的实现类,实现了抽象工厂中定义的工厂方法,并可由客户端调用,返回具体产品的实例。
抽象产品(Product):定义产品的接口,是工厂方法所创建对象的公共父类。
具体产品(ConcreateProduct):实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品一一对应。
与简单工厂模式相比,工厂方法模式最重要的区别是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类
伪代码
public interface IButton{
//抽象方法
void methodSome();
}
//具体产品
public class WhiteButton implements IButton{
//实现抽象方法
public void methodSome(){
...
}
}
public class RedButton implements IButton{
//实现抽象方法
public void methodSome(){
...
}
}
//抽象工厂
public interface IFactory{
IButton createButton();
}
//具体工厂
public class RedButtonFactory implements IFactory{
public IButton createButton(){
return new RedButton();
}
}
public class WhiteButtonFactory implements IFactory{
public IButton createButton(){
return new WhiteButton();
}
}
//客户端
public class Client{
public static void main(String[] args){
IFactory factory = new RedButtonFactory();
IButton redButton = factory.createButton();
}
}
应用
看Logback工厂方法的应用,其类图如下所示
由上图可以看到,已经分离出不同工厂负责创建不同日志框架,如Substitute日志框架、NOP日志框架、Log4J日志框架。
优缺点
优点
1.灵活性增强,对于新产品的创建,只需要多写一个工厂类。不用修改源代码,符合开闭原则
2.典型的解耦框架,高层模块只需知道产品的抽象类,无需关心其他实现类。
缺点
1.工厂类的数量容易过多,增加复杂度。
2.增加了系统的抽象性。
3.抽象产品只能生产一种类型的产品,此弊端可以使用抽象工厂模式解决。
摘录
-
设计模式就该这么学[谭勇德]