設計模式--抽象工廠模式

抽象工廠模式

Java工程源碼

類圖

這裏寫圖片描述


定義
- 爲創建一組相關或相互依賴的對象提供一個接口,而且無需指定它們的具體類


優缺點
- 優點:封裝性,每個產品的實現類不是高層模塊要關心的,它要關心的是接口或抽象類
- 缺點:產品族擴展非常困難,嚴重違反開閉原則


使用場景
- 一個對象族都有相同的約束


注意事項
- 抽象工廠模式,產品族擴展困難,但產品等級擴展卻非常容易


下面我們新建2種產品AB,每種產品分爲等級1和等級2
抽象產品類

public abstract class AbstractProduct {
    /**
     * 每個產品共有的方法
     */
    public void shareMethod() {
        System.out.println("每個產品共有的方法");
    }
}

抽象產品類A

public abstract class AbstractProductA extends AbstractProduct {
    /**
     * 每個產品相同方法,實現不同
     */
    public abstract void doSomething();
}

抽象產品類B

public abstract class AbstractProductB extends AbstractProduct {
    /**
     * 每個產品相同方法,實現不同
     */
    public abstract void doSomething();
}

抽象工廠類

public abstract class AbstractCreator {
    /**
     * 創建A產品家族
     *
     * @return A產品家族
     */
    public abstract AbstractProductA createProductA();

    /**
     * 創建B產品家族
     *
     * @return B產品家族
     */
    public abstract AbstractProductB createProductB();
}

產品A等級1的實現類

public class ProductA1 extends AbstractProductA {
    public void doSomething() {
        System.out.println("產品A1的實現方法");
    }
}

產品A等級2的實現類

public class ProductA2 extends AbstractProductA {
    public void doSomething() {
        System.out.println("產品A2的實現方法");
    }
}

產品B等級1的實現類

public class ProductB1 extends AbstractProductB {
    public void doSomething() {
        System.out.println("產品B1的實現方法");
    }
}

產品B等級2的實現類

public class ProductB2 extends AbstractProductB {
    public void doSomething() {
        System.out.println("產品B2的實現方法");
    }
}

產品等級1的實體工廠類

public class Creator1 extends AbstractCreator {
    public Creator1() {
        System.out.println("工廠1創建");
    }

    // 只生產產品等級爲1的A類產品
    @Override
    public AbstractProductA createProductA() {
        return new ProductA1();
    }

    // 只生產產品等級爲1的B類產品
    @Override
    public AbstractProductB createProductB() {
        return new ProductB1();
    }
}

產品等級2的實體工廠類

public class Creator2 extends AbstractCreator {
    public Creator2() {
        System.out.println("工廠2創建");
    }

    // 只生產產品等級爲2的A類產品
    @Override
    public AbstractProductA createProductA() {
        return new ProductA2();
    }

    // 只生產產品等級爲2的B類產品
    @Override
    public AbstractProductB createProductB() {
        return new ProductB2();
    }
}

場景類

public class Client {
    public static void main(String[] args) {
        // 定義兩個工廠
        AbstractCreator creator1 = new Creator1();
        AbstractCreator creator2 = new Creator2();
        //工廠生產產品
        AbstractProductA a1 = creator1.createProductA();
        AbstractProductA a2 = creator2.createProductA();
        AbstractProductB b1 = creator1.createProductB();
        AbstractProductB b2 = creator2.createProductB();
        a1.doSomething();
        a2.doSomething();
        b1.doSomething();
        b2.doSomething();

        b1.shareMethod();
    }
}

運行結果

工廠1創建
工廠2創建
產品A1的實現方法
產品A2的實現方法
產品B1的實現方法
產品B2的實現方法
每個產品共有的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章