不再提供一个统一的工厂类,而是提供多个工厂类。
定义
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
角色
Product(抽象产品)
它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的公共父类。
public interface Product {
void productMethod();
}
ConcreteProduct(具体产品)
实现抽象产品接口。
public class ProductA implements Product {
@Override
public void productMethod() {
System.out.println("我是产品A");
}
}
Factory(抽象工厂)
声明了工厂方法,用于返回一个产品。
public interface Factory {
Product getProduct();
}
ConcreteFactory(具体工厂)
是抽象工厂类的子类,实现了抽象工厂中定义的工厂方法,并由客户端直接调用,返回一个具体的产品。
具体工厂还可以负责产品对象的初始化工作。
public class ConcreteFactoryA implements Factory{
@Override
public Product getProduct() {
Product product;
product = new ProductA();
// 具体产品配置
return new ProductA();
}
}
客户类
public class Client {
public static void main(String[] args) {
Factory factory;
Product product;
factory = new ConcreteFactoryA();
product = factory.getProduct();
product.productMethod();
}
}
测试结果:
我是产品A
优点
(1)只需要得到具体产品,隐藏具体产品的创建细节。
(2)工厂与产品的多态性设计是该模式的关键。
(3)添加新产品时,只需要添加该产品的具体实现,以及为该产品“配置”具体工厂。
缺点
(1)添加新产品时需要同时增加类的实现及配置对应的工厂,增加了系统开销。
(2)增加了系统的抽象性和理解难度。
适用场景
只需要拿来用,而不需要知道产品的创建细节。