抽象工廠模式設計模式
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠建立其餘工廠。該超級工廠又稱爲其餘工廠的工廠。這種類型的設計模式屬於建立型模式,它提供了一種建立對象的最佳方式。ide
在抽象工廠模式中,接口是負責建立一個相關對象的工廠,不須要顯式指定它們的類。每一個生成的工廠都能按照工廠模式提供對象。測試
意圖:提供一個建立一系列相關或相互依賴對象的接口,而無需指定它們具體的類。spa
主要解決:主要解決接口選擇的問題。設計
什麼時候使用:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。code
如何解決:在一個產品族裏面,定義多個產品。對象
關鍵代碼:在一個工廠裏聚合多個同類產品。blog
應用實例:下面例子中鼠標,鍵盤,耳麥爲產品,惠普,戴爾爲工廠,抽象工廠模式也就是不只生產鼠標,同時生產鍵盤。也就是 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廠商這個父類中,增長生產耳麥的接口。最後在戴爾工廠,惠普工廠這兩個類中,分別實現生產戴爾耳麥,惠普耳麥的功能。