設計模式之四:抽象工廠模式
阿新 • • 發佈:2019-02-20
抽象工廠模式(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(); } }