工厂方法模式

135 阅读1分钟

不再提供一个统一的工厂类,而是提供多个工厂类。

定义

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。

角色

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)增加了系统的抽象性和理解难度。

适用场景

只需要拿来用,而不需要知道产品的创建细节。