1. 程式人生 > >工廠模式 - 工廠方法模式

工廠模式 - 工廠方法模式

客戶端 ace 多態性 定義 ber cto rri 而且 eat

1、工廠方法模式

  工廠方法模式是類的創建模式,又叫做虛擬構造子模式或者多態性工廠模式。工廠方法模式的用意是定義一個創建產品對象的工廠接口,將實際工作推遲到子類中。

1.1、什麽是工廠方法模式

工廠方法模式是簡單工廠模式的進一步抽象和推廣。由於使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了他的缺點。

工廠方法模式果中,核心的工廠類不在負責所有的產品的創建,而是將具體的創建工作交給子類去做(具體工廠),核心工廠變成了抽象工廠,僅負責給出具體工廠子類必須實現的接口,而不接觸哪一個產品類應當被實例化的細節。

1.2、簡單工廠模式的結構

抽象工廠(Creator)角色:工廠方法模式的核心,與應用沒有關系。任何在模式中創建對象的工廠類必須實現這個接口。抽象工廠可以是接口也可以是抽象類。

具體工廠類(Concrete Creator)角色:實現抽象工廠接口的具體Java類。具體工廠角色含有與應用緊密相關的邏輯,受到應用程序的調用以創建產品對象。

抽象產品(Product)角色:工廠方法模式所創建的對象的父類,或他們共同擁有的接口。抽象產品角色可以用一個Java接口或者Java抽象類表示。

具體產品(Concrete Product)角色:工廠方法模式所創建的任何對象都是某個具體產品角色的實例,實現了抽象產品角色接口。具體產品角色由一個具體Java類實現。

  

抽象產品:

/**
 * 抽象產品
 */
public interface
Product { /** * 用於打印產品信息 */ void print(); }

抽象工廠:

/**
 * 抽象工廠
 */
public interface Creator {

    /**
     * 工廠方法
     */
    Product factory();
}

具體產品:

/**
 * 具體產品1
 */
public class ConcreteProduct1 implements  Product{
    @Override
    public void print() {
        System.out.println(
"this is ConCreteProduct1 ..."); } }

具體產品:

/**
 * 具體產品2
 */
public class ConcreteProduct2 implements  Product{
    @Override
    public void print() {
        System.out.println("this is ConCreteProduct2 ...");
    }
}

具體工廠:

/**
 * 具體工廠
 */
public class ConcreteCreator1 implements Creator {

    @Override
    public Product factory() {
        return new ConcreteProduct1();
    }
}

具體工廠:

/**
 * 具體工廠
 */
public class ConcreteCreator2 implements Creator {

    @Override
    public Product factory() {
        return new ConcreteProduct2();
    }
}

客戶端:

/**
 * 客戶端
 */
public class Client {

    public static void main(String[] args) {
        Creator creator1 = new ConcreteCreator1();
        Product product1 = creator1.factory();
        product1.print();

        Creator creator2 = new ConcreteCreator2();
        Product product2 = creator2.factory();
        product2.print();
    }
}

運行結果:

技術分享圖片

類圖:

技術分享圖片

1.3、優點

抽象出了抽象工廠接口,通過不斷的派生出子類從而實現擴展而不需修改抽象接口或者具體工廠,實現了開閉原則。如果抽象工廠為抽象類,則子類能繼承繼承抽象工廠的行為。

具體工廠返回的數據類型為抽象產品,客戶端不需要知道所得到的產品的真實類型。創建對象的細節封裝在了具體工廠內部。

1.4、實例

抽象產品:水果

/**
 * 抽象產品角色
 * 水果
 */
public interface Fruit {

    /**
     * 默認方法,用於打印
     * @param msg 打印的信息
     */
    default void log(String msg){
        System.out.println(msg);
    }

    /**
     * 生長
     */
    void grow();

    /**
     * 收獲
     */
    void harvest();

    /**
     * 種植
     */
    void plant();
}

具體產品:蘋果

/**
 * 具體產品
 * 蘋果
 */
@Data
public class Apple implements Fruit {

    /**
     * 樹齡
     */
    private int treeAge;

    @Override
    public void grow() {
        log("Apple is growing ...");
    }

    @Override
    public void harvest() {
        log("Apple has been harvested ...");
    }

    @Override
    public void plant() {
        log("Apple has been planted ...");
    }
}

具體產品:葡萄

/**
 * 具體產品
 * 葡萄
 */
@Data
public class Grape implements Fruit {

    /**
     * 是否有籽
     */
    private boolean seedless;

    @Override
    public void grow() {
        log("Grape is growing ...");
    }

    @Override
    public void harvest() {
        log("Grape has been harvested ...");
    }

    @Override
    public void plant() {
        log("Grape has been planted ...");
    }
}


具體產品:草莓

/**
 * 具體產品
 * 草莓
 */
public class Strawberry implements Fruit {

    @Override
    public void grow() {
        log("Strawberry is growing ...");
    }

    @Override
    public void harvest() {
        log("Strawberry has been harvested ...");
    }

    @Override
    public void plant() {
        log("Strawberry has been planted ...");
    }
}


抽象工廠:水果工廠

/**
 * 抽象工廠
 */
public interface FruitGardener {

    /**
     * 工廠方法
     */
    Fruit factory();
}


具體工廠:蘋果工廠

/**
 * 具體工廠
 * 蘋果工廠
 */
public class AppleGardener implements FruitGardener {
    @Override
    public Fruit factory() {
        return new Apple();
    }
}


具體工廠:葡萄工廠

/**
 * 具體工廠
 * 葡萄工廠
 */
public class GrapeGardener implements FruitGardener {
    @Override
    public Fruit factory() {
        return new Grape();
    }
}


具體工廠:草莓工廠

/**
 * 具體工廠
 * 草莓工廠
 */
public class StrawberryGardener implements FruitGardener {
    @Override
    public Fruit factory() {
        return new Strawberry();
    }
}

運行結果:

技術分享圖片

工廠模式 - 工廠方法模式