工厂方法模式
工厂方法模式是类的创建模式,用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到工厂子类中。
结构与角色
涉及到角色:
- 抽象工厂角色(Creator)
这个角色是工厂方法模式的核心,任何创建产品对象的工厂类都必须实现这个接口。在实际的系统中这个角色也可以是一个java的抽象类。 - 具体工厂角色(Concrete Creator)
这个角色是实现了抽象工厂接口的java类,含有与应用密切相关的逻辑,并且受到应用程序的调用创建产品。 - 抽象产品角色(Product)
工厂方法模式创建产品对象的超类,也是产品对象共同的父类或共同的接口。实际系统中这个对象常常用java抽象类实现 - 具体产品角色(Concrete Product)
这个角色实现了抽象产品角色定义的接口,工厂方法模式创建的每一个对象都是某个具体产品实例。
实现
1.抽象工厂角色(Creator)
public interface Creator
{
public Product factory();
}
2.抽象产品角色(Product)
public interface Product
{
}
最简单的情形,只定义一个标识接口;
3.具体产品角色(Concrete Product)
是系统向外提供的产品,会包含一系列的逻辑
public class ConcreteProduct1 implements Product
{
public ConcreteProduct1(){
System.out.println("产品1");
}
}
public class ConcreteProduct2 implements Product
{
public ConcreteProduct2(){
System.out.println("产品2");
}
}
4.具体工厂角色(Concrete Creator)
public class ConcreteCreator1 implements Creator
{
@Override
public Product factory()
{
return new ConcreteProduct1();
}
}
public class ConcreteCreator2 implements Creator
{
@Override
public Product factory()
{
return new ConcreteProduct2();
}
}
5.客户端
public class Client
{
static Creator creator1,creator2;
static Product product1,product2;
public static void main(String[] args){
creator1 = new ConcreteCreator1();
creator1.factory();
creator2 = new ConcreteCreator2();
creator2.factory();
}
}
具体工厂创建产品返回的数据类型是抽象的Product,而不是具体的某个产品,客户端也不必知道具体的产品创建的细节。这个多态的设计将工厂类选择创建哪一款产品,如何创建完全的封装在了具体工厂的内部。
工厂方法模式和简单工厂模式对比
简单工厂模式的核心是一个具体的工厂类,他知道每一个产品,决定哪一个产品被创建。优点是客户端独立于产品的创建过程,系统引入新的产品的时候不需要修改客户端。缺点是引入新的产品需要修改工厂类,将必要的逻辑加入工厂类中。
工厂方法模式继承了简单工厂模式的优点,克服了其缺点。该模式的核心是一个抽象工厂,将产品的创建过程交给其子类,系统在引入新的产品的时候只需要增加一个子类工厂创建新的产品,充分体现“开–闭”设计原则。