工厂方法模式是类的创建模式,又叫做虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。它的用意是定义一个刚创建产品对象的工厂接口,将实际创建工作推迟到子类中。工厂方法模式涉及到四个角色:
- 抽象工厂(Creator)角色:担任这个角色的是工厂方法模式的核心,它与应用程序无关。任何在模式中创建对象的工厂类必须实现该接口。在实际系统中这个角色常常由抽象JAVA类实现。
- 具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体Java类。具体工厂角色含有与应用关系密切相关的逻辑,并且受到应用程序的调用以创建产品对象。
- 抽象产品(Product)角色:工厂方法模式所创建的对象的超类,也就是产品对象的共同父类或共同拥有的接口。在实际系统中这个角色通常由抽象JAVA类实现。
- 具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所申明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。
工厂方法模式之所以有一个别名叫多态性工厂模式,显然是因为具体工厂类都有共同的接口,或者都有共同的父类。如果系统需要加入一个新的产品,那么所需要的就是向系统中加入一个这个产品类以及它所对应的工厂类。没有必要修改客户端,也没有必要修改抽象工厂角色或者其他已有的具体工厂角色。对于增加新的产品类而言,这个系统完全支持“开-闭”原则。
工厂方法模式源码:
1. 抽象工厂接口
package com.javapatterns.factorymethod;
public interface Creator {
/**
* 工厂方法
*/
public Product factory();
}
2. 抽象产品接口
package com.javapatterns.factorymethod;
public interface Product {
}
3. 具体工厂类ConcreteCreator1
package com.javapatterns.factorymethod;
public class ConcreteCreator1 implements Creator {
/**
* 工厂方法
*/
public Product factory() {
return new ConcreteProduct1();
}
}
4. 具体工厂类ConcreteCreator2
package com.javapatterns.factorymethod;
public class ConcreteCreator2 implements Creator {
/**
* 工厂方法
*/
public Product factory() {
return new ConcreteProduct2();
}
}
5. 具体产品类ConcreteProduct1
package com.javapatterns.factorymethod;
public class ConcreteProduct1 implements Product {
public ConcreteProduct1() {
//do something
}
}
6. 具体产品类ConcreteProduct2
package com.javapatterns.factorymethod;
public class ConcreteProduct2 implements Product {
public ConcreteProduct2() {
//do something
}
}
7. 客户端Client类
package com.javapatterns.factorymethod;
public class Client {
private static Creator creator1, creator2;
private static Product product1, product2;
public static void main(String[] args) {
creator1 = new ConcreteCreator1();
prod1 = creator1.factory();
creator2 = new ConcreteCreator2();
prod2 = creator2.factory();
}
}