天天看點

設計模式之生成執行個體_AbstractFactory模式_将關聯零件組裝成産品

前言

​​部落客github​​

​​部落客個人部落格http://blog.healerjean.com​​

抽象工廠的工作是将​

​抽象零件​

​​構件組裝成​

​抽象産品​

​,我們不關心零件的具體實作,而是隻關心接口,我們僅适用該接口将零件組裝成産品

1、示例程式

1、示例代碼

1.1、抽象工廠 ​

​Factory​

​ (抽象類或者接口)
/**
 * 表示抽象工程的類 制作 滑鼠,鍵盤
 */
public abstract class Factory {

    public abstract Key creatKey();

    public abstract Mouse createMouse();

}      
1.2、抽象的零件 - 鍵盤 ​

​Key​

​ (抽象類或者接口)
public interface Key {

    void key() ;
}      
1.3、抽象的零件 - 滑鼠 ​

​Mouse​

​ (抽象類或者接口)
public interface Mouse {

    void mouse() ;

}      
1.4、具體的工廠​

​HPFactory​

/**
 * 具體工廠,惠普工廠
 */
public class HPFactory extends Factory {


    @Override
    public Key creatKey() {
        return new HPKey();
    }

    @Override
    public Mouse createMouse() {
        return new HPMouse();
    }

}      

1.4.2、具體的零件 ​

​HPKey​

public class HPKey implements Key {

    @Override
    public void key() {
        System.out.println("惠普建立鍵盤零件");
    }
}      

1.4.3、具體的零件​

​HPMouse​

public class HPMouse implements Mouse {

    @Override
    public void mouse() {
        System.out.println("惠普建立滑鼠零件");
    }

}      
1.5、具體的工廠​

​DellFactory​

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName DellFactory
 * @date 2019/5/29  9:46.
 * @Description 具體工程:戴爾工廠
 */
public class DellFactory  extends Factory {

    @Override
    public Key creatKey() {
        return new DellKey();
    }

    @Override
    public Mouse createMouse() {
        return new DellMouse();
    }

}      

1.5.1、具體的零件 ​

​DellKey​

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName DellKey
 * @date 2019/5/29  9:44.
 * @Description 零件:戴爾鍵盤
 */
public class DellKey implements Key {

    @Override
    public void key() {
        System.out.println("戴爾建立鍵盤零件");
    }
}      

1.5.2、具體的零件​

​DellMouse​

/**
 * @author HealerJean
 * @version 1.0v
 * @ClassName DellMouse
 * @date 2019/5/29  9:44.
 * @Description 零件:戴爾滑鼠
 */
public class DellMouse implements Mouse {

    @Override
    public void mouse() {
        System.out.println("戴爾建立滑鼠零件");
    }

}      
1.6、Main測試
package com.hlj.moudle.design.D05_生成執行個體.D08_AbstractFactory.Sample;


import com.hlj.moudle.design.D05_生成執行個體.D08_AbstractFactory.Sample.factory.Factory;
import com.hlj.moudle.design.D05_生成執行個體.D08_AbstractFactory.Sample.factory.Key;
import com.hlj.moudle.design.D05_生成執行個體.D08_AbstractFactory.Sample.factory.Mouse;
import com.hlj.moudle.design.D05_生成執行個體.D08_AbstractFactory.Sample.listfactory.HPFactory;

public class Main {
    public static void main(String[] args) {

        Factory factory = new HPFactory();
//        Factory factory = new DellFactory();

        Mouse mouse = factory.createMouse();
        Key key = factory.creatKey();

        mouse.mouse();
        key.key();

    }
}      

2、UML 圖

[外鍊圖檔轉存失敗(img-IVRRbFvc-1566550650282)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1559097212752.png)]

3、AbstractFactory中登場角色

3.1.抽象産品(Product):

抽象産品是一個抽象類或接口,負責定義具體産品必須實作的方法。

3.2.具體産品(ConcreteProduct):

具體産品是一個類,如果Product是一個抽象類,那麼具體産品是Product的子類;如果Product是一個接口,那麼具體産品是實作Product接口的類。

3.3.抽象工廠(AbstractFactory):

抽象工廠是一個接口或抽象類,負責定義若幹個抽象方法。

4.具體工廠(ConcreteFactory):

如果抽象工廠是抽象類,具體工廠就是抽象工廠的子類;如果抽象工廠是接口,具體工廠是實作抽象工廠的類。具體工廠覆寫抽象工廠中的抽象方法,使該方法傳回具體産品的執行個體。

4、擴充思路的要點

抽象工廠模式也就是不僅生産滑鼠,同時生産鍵盤。就是 工廠是個父類,有生産滑鼠,生産鍵盤兩個接口。

戴爾工廠,惠普工廠繼承它,可以分别生産戴爾滑鼠+戴爾鍵盤,和惠普滑鼠+惠普鍵盤。

在抽象工廠模式中,假設我們需要增加一個工廠

假設我們增加華碩工廠,則我們需要增加華碩工廠,和戴爾工廠一樣,繼承Factory工廠。之後建立華碩滑鼠,繼承滑鼠類。建立華碩鍵盤,繼承鍵盤類即可。

[外鍊圖檔轉存失敗(img-04cL1zu3-1566550650284)(https://raw.githubusercontent.com/HealerJean/HealerJean.github.io/master/blogImages/1559098490451.png)]

在抽象工廠模式中,假設我們需要增加一個零件

添加産品容易,添加零件難