抽象工廠模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱為其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
意圖:提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
主要解決:主要解決接口選擇的問題。
何時使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。
如何解決:在一個產品族里面,定義多個產品。
關鍵代碼:在一個工廠里聚合多個同類產品。
應用實例:下面例子中鼠標,鍵盤,耳麥為產品,惠普,戴爾為工廠,抽象工廠模式也就是不僅生產鼠標,同時生產鍵盤。也就是 PC 廠商是個父類,有生產鼠標,生產鍵盤兩個接口。戴爾工廠,惠普工廠繼承它,
可以分別生產戴爾鼠標+戴爾鍵盤,和惠普鼠標+惠普鍵盤。創建工廠時,由戴爾工廠創建。后續工廠.生產鼠標()則生產戴爾鼠標,工廠.生產鍵盤()則生產戴爾鍵盤。
以下是具體實現代碼,首先是代碼結構圖:
import cn.review.day03.abstractfactory.product.Keboy; import cn.review.day03.abstractfactory.product.Mouse; /** * PC廠商工廠抽象類 * @author dyq * */ public abstract class PcFactory { public abstract Mouse createMouse(); public abstract Keboy createKeboy(); }
import cn.review.day03.abstractfactory.product.DellKeyboy; import cn.review.day03.abstractfactory.product.DellMouse; import cn.review.day03.abstractfactory.product.Keboy; import cn.review.day03.abstractfactory.product.Mouse; /** * 戴爾生產工廠 * @author dyq * */ public class DellFactory extends PcFactory{ @Override public Mouse createMouse() { return new DellMouse(); } @Override public Keboy createKeboy() { return new DellKeyboy(); } }
import cn.review.day03.abstractfactory.product.HpKeboy; import cn.review.day03.abstractfactory.product.HpMouse; import cn.review.day03.abstractfactory.product.Keboy; import cn.review.day03.abstractfactory.product.Mouse; /** * 惠普生產工廠 * @author dyq * */ public class HpFactory extends PcFactory{ @Override public Mouse createMouse() { return new HpMouse(); } @Override public Keboy createKeboy() { return new HpKeboy(); } }
/** * 生成工廠器類,通過不同的廠家來獲取不同的生產工廠 * @author dyq * */ public class FactoryProducer { public static PcFactory getFactory(String choice){ if(choice.equalsIgnoreCase("DELL")){ return new DellFactory(); } else if(choice.equalsIgnoreCase("HP")){ return new HpFactory(); } return null; } }
/** * 產品之鼠標接口 * @author dyq * */ public interface Mouse { public String sayHi(); }
/** * 產品之鍵盤接口 * @author dyq * */ public interface Keboy { public String sayHi(); }
/** * 戴爾鍵盤生產類 * @author dyq * */ public class DellKeyboy implements Keboy{ @Override public String sayHi() { return "生產了戴爾鍵盤"; } }
/** * 戴爾鼠標生產類 * @author dyq * */ public class DellMouse implements Mouse{ @Override public String sayHi() { return "生產了戴爾鼠標"; } }
/** * * @author dyq * */ public class HpKeboy implements Keboy{ @Override public String sayHi() { return "生產了惠普鍵盤"; } }
public class HpMouse implements Mouse{ @Override public String sayHi() { return "生產了惠普鼠標"; } }
最后是測試類:
import cn.review.day03.abstractfactory.factory.FactoryProducer; import cn.review.day03.abstractfactory.factory.PcFactory; import cn.review.day03.abstractfactory.product.Mouse; /** * 測試抽象工廠模式 * @author dyq * */ public class DesignPatternAbstractFactory { public static void main(String[] args) { PcFactory dellPcFactory = FactoryProducer.getFactory("DELL"); Mouse dellMouse = dellPcFactory.createMouse(); String mouse1 = dellMouse.sayHi(); System.out.println(mouse1); PcFactory hpPcFactory = FactoryProducer.getFactory("HP"); Mouse hpMouse = hpPcFactory.createMouse(); String mouse2 = hpMouse.sayHi(); System.out.println(mouse2); } }
在抽象工廠模式中,假設我們需要增加一個產品
假設我們增加耳麥這個產品,則首先我們需要增加耳麥這個父類,再加上戴爾耳麥,惠普耳麥這兩個子類。
之后在PC廠商這個父類中,增加生產耳麥的接口。最后在戴爾工廠,惠普工廠這兩個類中,分別實現生產戴爾耳麥,惠普耳麥的功能。