抽象工廠
提供一個接口,用於創建相關或依賴對象的家族,而不需要指定具體類.
二. 設計某些系統是坷以南非要為用戶提供一系列相關的的對象,但系統不希望用戶真接使用new 運算符實例化這些對象,
而由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類創建這些對象,還要知道它們之間的關係,使得用戶
的代碼和這些類形成緊耦合,缺乏彈性,不利于維護.這時就可以使用抽象工廠模式來解決這些問題.
三. 抽象工廠的UML類圖如下:
四. 接前一章"工廠方法"的事例基礎上,增加了原料類,酒店必須從規定的原料工廠中採購原料; 完整示例代碼如下:
1. 抽象產品: 菜肴的制作流程
package creationalPattern.factory.abstracted; /** * 菜肴的制作流程[抽象產品] * @author Liyongbin * @date 2011-02-06 */ public interface ICuisine { //採購原料 public String purchase(); //制作加工 public String processing(); //成品銷售 public String vendition(); }
抽象產品:酒店採購原料工廠
package creationalPattern.factory.abstracted; /** * 原料工廠[抽象產品] * @author Liyongbin * @date 2011-02-06 */ public interface IMaterial { //素食原料 public String maigre(); //荤食原料 public String meat(); //醬料原料 public String catsup(); }
2.抽象工廠: 酒店[總店]
package creationalPattern.factory.abstracted; /** * 香格裡拉酒店[總店]--抽象工廠[AbstractFactory] * @author Liyongbin * @date 2011-02-06 */ public abstract class ShangriLaHotel { /** * 採購原料的方法[工廠方法] * @return */ public abstract IMaterial purchaseMaterial(String localMeterial); /** * 制作菜肴的方法[工廠方法] * @param localCuisine生產的地方菜 * @return */ public abstract ICuisine cooking(String localCuisine); /** * 訂單方法 * @param localCuisine預訂的地方菜 */ //使用總店的訂單系統 public void order(String localMeterial, String localCuisine) { //訂購的菜系 ICuisine cuisine =cooking(localCuisine); System.out.println(cuisine.purchase()); //採購原料 IMaterial material = purchaseMaterial(localMeterial); System.out.println(material.maigre()); System.out.println(material.meat()); System.out.println(material.catsup()); System.out.println(cuisine.processing()); System.out.println(cuisine.vendition()); } }
3. 地方名菜制作流程:湘菜
package creationalPattern.factory.abstracted; /** * 湘菜類 * @author Liyongbin * @date 2011-02-06 */ public class HunanCuisine implements ICuisine{ @Override public String processing() { return "湘菜烹調加工"; } @Override public String purchase() { return "湘菜原料採購"; } @Override public String vendition() { return "湘菜成品銷售"; } }
地方名菜制作流程:川菜
package creationalPattern.factory.abstracted; /** * 川菜類 * @author Liyongbin * @date 2011-02-06 */ public class SichuanCuisine implements ICuisine { @Override public String processing() { return "川菜烹調加工"; } @Override public String purchase() { return "川菜原料採購"; } @Override public String vendition() { return "川菜成品銷售"; } }
4.北京的原料工廠
package creationalPattern.factory.abstracted; /** * 北京的原料工廠 * @author Liyongbin * @date 2011-02-06 */ public class Material4BeiJing implements IMaterial { @Override public String catsup() { return "從北京原料廠採購[醬料原料]"; } @Override public String maigre() { return "從北京原料廠採購[素食原料]"; } @Override public String meat() { return "從北京原料廠採購[葷食原料]"; } }
上海原料工廠
package creationalPattern.factory.abstracted; /** * 上海原料工廠 * @author Liyongbin * @date 2011-02-06 */ public class Material4ShangHai implements IMaterial { @Override public String catsup() { return "從上海原料廠採購[醬料原料]"; } @Override public String maigre() { return "從上海原料廠採購[素食原料]"; } @Override public String meat() { return "從上海原料廠採購[葷食原料]"; } }
5.北京分店
package creationalPattern.factory.abstracted; /** * 香格裡拉酒店[北京分店] * @author Liyongbin * @date 2011-02-06 */ public class ShangriLaHotel4BeiJing extends ShangriLaHotel{ /** * 採購本地原料 */ public IMaterial purchaseMaterial(String localMeterial) { IMaterial material =null; if (localMeterial.equalsIgnoreCase("BeiJing")) {//北京原料 material=new Material4BeiJing(); } else if(localMeterial.equalsIgnoreCase("ShangHai")){//上海原料 material=new Material4ShangHai(); } return material; } /** * 制作有本地[北京]特色的地方[川,湘]名菜 * @param localCuisine預訂的地方名菜 */ @Override public ICuisine cooking(String localCuisine) { System.out.println("香格裡拉大酒店[北京分店]"); ICuisine cuisine=null; if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜 cuisine=new HunanCuisine(); } else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜 cuisine=new SichuanCuisine(); } return cuisine; } }
上海分店:
package creationalPattern.factory.abstracted; /** * 香格裡拉大酒店[上海分店] * @author Liyongbin * @date 2011-02-06 */ public class ShangriLaHotel4ShangHai extends ShangriLaHotel{ /** * 採購本地原料 */ @Override public IMaterial purchaseMaterial(String localMeterial) { IMaterial material =null; if (localMeterial.equalsIgnoreCase("BeiJing")) {//北京原料 material=new Material4BeiJing(); } else if(localMeterial.equalsIgnoreCase("ShangHai")){//上海原料 material=new Material4ShangHai(); } return material; } /** * 制作有本地[上海]特色的地方[川,湘]名菜 * @param localCuisine預訂的地方名菜 */ @Override public ICuisine cooking(String localCuisine) { System.out.println("香格裡拉大酒店[上海分店]"); ICuisine cuisine=null; if (localCuisine.equalsIgnoreCase("Hunan")) {//湘菜 cuisine=new HunanCuisine(); } else if(localCuisine.equalsIgnoreCase("Sichuan")){//川菜 cuisine=new SichuanCuisine(); } return cuisine; } }
6.網上訂購: 可以定各地方名菜,還可以指定使用的原料;
package creationalPattern.factory.abstracted; /** * 抽象工廠測試 * @author Liyongbin * @date 2011-02-06 */ public class AbstractFactoryTest { public static void main(String[] args) { //網上訂購川菜,用北京的原料 ShangriLaHotel slh4bj = new ShangriLaHotel4BeiJing(); slh4bj.order("BeiJing", "Sichuan"); System.out.println("==================="); //網上訂購湘菜,用上海的原料 ShangriLaHotel slh4sh = new ShangriLaHotel4ShangHai(); slh4sh.order("ShangHai", "Hunan"); } }
7. 運行結果如下:
相关推荐
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
NULL 博文链接:https://zhouhaitao.iteye.com/blog/1003684
Abstract Factory模式 1 定义创建对象的接口,并封装对象的创建 2 将具体化类的工作延迟到了类中 3 创建创建一组相关对象或者说是一组相互依赖的对象 一般情况下,我们为了提高内聚和松耦合,经常会使用多态来...
设计模式举例 抽象工厂模式 代码+用例图 设计模式, 设计模式举例-抽象工厂模式(有图有真相)
博客 走进设计模式之抽象工厂(Abstract Factory) 对应代码
设计模式C++学习之抽象工厂模式(AbstractFactory)
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) (Level 300)
要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图...
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) 体验课程
c#设计模式 工厂模式 抽象工厂(Abstract Factory)模式 引进抽象工厂模式
C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式),.net常用设计模式。
今天,我要为大家介绍的是Java中的抽象工厂模式,这是一种非常实用的设计模式,让我们一起来探索它的魅力吧! 内容概要 本文将从以下几个方面详细介绍Java抽象工厂模式: 抽象工厂模式的应用场景。 抽象工厂模式...
设计模式抽象工厂模式(AbstractFactory)源代码
C#设计模式之抽象工厂(abstract factory)模式示例源代码
3. 抽象工厂模式(Abstract Factory) 这三种模式从上到下逐步抽象,并且更具一般性。还有一种分类法,就是将简单工厂模式看为工厂方法模式的一种特例,两个归为一类。下面是使用工厂模式的两种情况: 1. 在编码时不...
抽象工厂模式用到了工厂方法模式来创建单一对象,AbstractFactory 中的 createProductA() 和 createProductB() 方法
抽象工厂模式可以实现不同数据库之间的无缝移植。 该项目是在三层架构的基础上改进的。希望对初学者有帮助。
设计模式,AbstractFactory,抽象工厂模式