抽象工廠模式AbstractFactory
一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机,同种类称为同等级
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品
抽象工廠模式結構:
1抽象产品 (Abstract Product) 为构成系列产品的一组不同但相关的产品声明接口。 2具体产品 (Concrete Product) 是抽象产品的多种不同类型实现。 所有变体 (维多利亚/现代)
都必须实现相应的抽象产品 (椅子/沙发)。 3抽象工厂 (Abstract Factory) 接口声明了一组创建各种抽象产品的方法。 4具体工厂 (Concrete Factory) 实现抽象工厂的构建方法。 每个具体工厂都对应特定产品变体,
且仅创建此种产品变体。 5尽管具体工厂会对具体产品进行初始化, 其构建方法签名必须返回相应的抽象产品。 这样, 使用工厂类的客户
端代码就不会与工厂创建的特定产品变体耦合。 客户端 (Client) 只需通过抽象接口调用工厂和产品对象,
就能与任何具体工厂/产品变体交互。
例子
前景:
按钮和复选框将被作为产品。 它们有两个变体: macOS 版和 Windows 版。
抽象工厂定义了用于创建按钮和复选框的接口。
而两个具体工厂都会返回同一变体的两个产品。
客户端代码使用抽象接口与工厂和产品进行交互,同样的代码能与依赖于不同工厂对象类型的多种产品变体进行交互。
按鈕接口:
/** * 所有button的父接口 */ public interface Button { void paint(); }
複選框接口
public interface Checkbox { void paint(); }
GUI抽象工廠類:
public interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }
按鈕兩種實現
public class MaxOsButton implements Button{ public void paint() { System.out.println("MacOs Button"); } }
public class WindowsButton implements Button{ public void paint() { System.out.println("Windows Button"); } }
複選框兩種實現
public class WindowsCheckbox implements Checkbox{ public void paint() { System.out.println("Windows--Checkbox"); } }
public class MacOSCheckbox implements Checkbox{ public void paint() { System.out.println("MacOS-Checkbox"); } }
GUI抽象工廠的兩種實現
public class MaxOSFactory implements GUIFactory{ public Button createButton() { return new MaxOsButton(); } public Checkbox createCheckbox() { return new MacOSCheckbox(); } }
public class WindowsFactory implements GUIFactory{ public Button createButton() { return new WindowsButton(); } public Checkbox createCheckbox() { return new WindowsCheckbox(); } }
appllication類,充當sever:
public class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory guiFactory){ this.button = guiFactory.createButton(); this.checkbox = guiFactory.createCheckbox(); } public void paint(){ button.paint(); checkbox.paint(); } }
client端
public class ClientTest { public static void main(String[] args) { /** * 傳入max工廠具體實現具體實現工廠 */ Application application =new Application(new MaxOSFactory()); application.paint(); /** * 傳入windows工廠具體實現工廠 */ System.out.println("###################"); Application application1 = new Application(new WindowsFactory()); application1.paint(); } } 結果: MacOs Button MacOS-Checkbox ################### Windows Button Windows--Checkbox
應用場景:
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构