抽象工厂模式

164 阅读1分钟

定义

提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

在该模式中,每一个具体工厂都提供了多个工厂方法用于产生多种不同类型的产品。,这些产品构成一个产品族。

角色

AbstractFactory(抽象工厂)

声明一组用于创建一类产品的方法,每一个方法对应一种产品。

public interface AbstractFactoty {
    Button createButton();
    TextField createTextField();
}

ConcreteFactory(具体工厂)

实现抽象工厂中的方法,生成一组具体产品,这些产品构成了一个产品族。

public class BlueConcreteFactory implements AbstractFactoty {
    @Override
    public Button createButton() {
        return new BlueButton();
    }

    @Override
    public TextField createTextField() {
        return new BlueTextField();
    }
}
public class GreenConcreteFactory implements AbstractFactoty {
    @Override
    public Button createButton() {
        return new GreenButton();
    }

    @Override
    public TextField createTextField() {
        return new GreenTextField();
    }
}

AbstractProduct(抽象产品)

声明每种产品所具有的业务方法。

public interface Button {
    void display();
}
public interface TextField {
    void displayTextField();
}

ConcreteProduct(具体产品)

实现抽象产品中的业务方法。

public class BlueButton implements Button {
    @Override
    public void display() {
        System.out.println("我是蓝色按钮");
    }
}
public class BlueTextField implements TextField {
    @Override
    public void displayTextField() {
        System.out.println("我是蓝色文本框");
    }
}
public class GreenButton implements Button {
    @Override
    public void display() {
        System.out.println("我是绿色按钮");
    }
}
public class GreenTextField implements TextField {
    @Override
    public void displayTextField() {
        System.out.println("我是绿色文本框");
    }
}

客户类

public class AbstractFactoryClient {
    public static void main(String[] args) {
        AbstractFactoty abstractFactoty;
        Button button;
        TextField textField;
        abstractFactoty = new BlueConcreteFactory();
        button = abstractFactoty.createButton();
        textField = abstractFactoty.createTextField();
        button.display();
        textField.displayTextField();
    }
}

测试结果:

我是蓝色按钮
我是蓝色文本框

缺点

修改产品等级结构,(譬如实例中增加其他组件等)对整体代码的修改量较大。

适用场景

(1)系统对其依赖的产品的细节不注重。

(2)系统中有多于一个的产品族。

(3)产品等级结构稳定。