1. 程式人生 > >設計模式之四:抽象工廠模式

設計模式之四:抽象工廠模式

抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其他工廠。該超級工廠又稱為其他工廠的工廠。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。

在抽象工廠模式中,介面是負責建立一個相關物件的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供物件。

介紹

意圖:提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

主要解決:主要解決介面選擇的問題。

何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

如何解決:在一個產品族裡面,定義多個產品。

關鍵程式碼:在一個工廠裡聚合多個同類產品。

優點:當一個產品族中的多個物件被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的物件。

缺點:產品族擴充套件非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加程式碼,又要在具體的裡面加程式碼。

使用場景:1、QQ 換面板,一整套一起換。 2、生成不同作業系統的程式。

//新建抽象工廠類

package com.xjh.demo.designpattern.pattern4;

public abstract class AbstractFactory {

    public abstract Face createFace();

    public abstract Skin createSkin();

    public abstract Foot createFoot();
}

//男生工廠

package com.xjh.demo.designpattern.pattern4;

public class BoyFactory extends AbstractFactory{

    @Override
    public Face createFace() {
      return new BoyFace();
    }

    @Override
    public Skin createSkin() {
        return new BoySkin();
    }

    @Override
    public Foot createFoot() {
        return new BoyFoot();
    }
}

//女生工廠

package com.xjh.demo.designpattern.pattern4;

public class GirlFactory extends AbstractFactory{

    @Override
    public Face createFace() {
        return new GirlFace();
    }

    @Override
    public Skin createSkin() {
        return new GirlSkin();
    }

    @Override
    public Foot createFoot() {
        return new GirlFoot();
    }
}

//臉部顏色

package com.xjh.demo.designpattern.pattern4;

public abstract class Face {

    public abstract void faceColor();
}

//腳部顏色

package com.xjh.demo.designpattern.pattern4;

public abstract class Foot {

    public abstract void footColor();
}
//面板顏色
package com.xjh.demo.designpattern.pattern4;

public abstract class Skin {
    public abstract void skinColor();
}

package com.xjh.demo.designpattern.pattern4;

public class BoyFace extends Face {

    @Override
    public void faceColor() {
        System.out.println("boy face is black ");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class BoyFoot extends Foot {

    @Override
    public void footColor() {
        System.out.println("boy foot is dirty ");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class BoySkin extends Skin {
    @Override
    public void skinColor() {
        System.out.println("boy skin is white ");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class GirlFace extends Face{

    @Override
    public void faceColor() {
        System.out.println("girl face is red");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class GirlFoot extends Foot {

    @Override
    public void footColor() {
        System.out.println("girl foot is pink");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class GirlSkin extends Skin{

    @Override
    public void skinColor() {
        System.out.println("girl skin is yellow");
    }
}
package com.xjh.demo.designpattern.pattern4;

public class Test {

    public static void main(String[] args) {
       //男生整體面板切換
        AbstractFactory abstractFactory = new BoyFactory();
        Face face = abstractFactory.createFace();
        Skin skin = abstractFactory.createSkin();
        Foot foot = abstractFactory.createFoot();
        face.faceColor();
        skin.skinColor();
        foot.footColor();
    }
}