java-設計模式-抽象工場模式

抽象工廠模式AbstractFactory

一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

工廠方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机,同种类称为同等级

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品

java-設計模式-抽象工場模式

 

 

 

 

 

抽象工廠模式結構:

java-設計模式-抽象工場模式

 

 

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

 

應用場景:

  1. 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
  2. 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
  3. 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构

 

上一篇:phpword操作checkbox复选框选择


下一篇:微信小程序开发(五)-常⻅组件