抽象工廠
提供一個接口,用於創建相關或依賴對象的家族,而不需要指定具體類.
二. 設計某些系統是坷以南非要為用戶提供一系列相關的的對象,但系統不希望用戶真接使用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. 運行結果如下:
相关推荐
总的来说,抽象工厂模式在Java中是一种非常实用的设计模式,它可以帮助我们封装产品的创建过程,降低系统间的耦合度,同时提供了更好的可扩展性,使得添加新的产品族或者产品变得更加容易。在处理具有多种变体的复杂...
设计模式---抽象工厂模式(Abstract Factory)-UML图 (StarUML)
**Java设计模式——抽象工厂** 在软件工程中,设计模式是一种在特定场景下解决常见问题的模板或蓝图。抽象工厂模式是设计模式中的一种结构型模式,它提供了一个创建对象族的接口,但允许子类决定实例化哪一个类。这...
抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...
抽象工厂模式是Java设计模式中的一种创建型模式,它提供了创建对象族的接口,而具体的对象族由子类决定。这种模式的主要目的是隔离接口与实现,使得客户端代码在更换产品族时无需修改,增强了软件的可扩展性和可维护...
例如,代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式(Factory Method Pattern)、抽象工厂模式(Abstract Factory Pattern)、适配器模式(Adapter Pattern)、模板方法模式(Template ...
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式...
Java设计模式是面向对象编程...在阅读《Chapter1___Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)》的相关资料时,你可以更深入地学习这些模式的细节,包括适用场景、优缺点以及如何在实际项目中实现。
这类模式关注对象的创建过程,包括单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。它们提供了创建对象的不同策略,使代码更加灵活...
抽象工厂模式是软件设计模式中的一种创建型模式,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定它们的具体类。在Java编程中,抽象工厂模式通常用于实现跨平台或者跨框架的接口,使得系统...
抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际产出的具体产品是什么。 在...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而具体的对象族由子类决定。这种模式允许系统在不指定具体产品的前提下,能够创建一系列相关或相互依赖的对象,同时避免了硬编码所造成的...
简单工厂模式是Java设计模式中创建型模式的一种,也被称为静态工厂方法模式。...但需要注意的是,在产品种类变得复杂或者需求频繁变动的情况下,可能需要考虑使用更灵活的设计模式,如工厂方法模式或者抽象工厂模式。
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
- **AbstractFactory**:声明创建抽象产品对象的操作接口。 - **ConcreteFactory**:实现创建具体产品对象的操作。 - **AbstractProduct**:为一类产品对象声明接口。 - **ConcreteProduct**:由相应具体工厂创建的...
抽象工厂模式是设计模式中的一种,它属于对象创建型模式,主要解决的是当系统需要创建一组相关或相互依赖的对象时,而这些对象的类在运行时可能未知的问题。这种模式提供了一个接口,用于创建相关或依赖对象的家族,...
抽象工厂模式是创建型设计模式的一种,它提供了一种创建对象族(一组具有相互依赖关系的对象)的方法,而无需指定具体类。这种模式的核心在于它允许客户端代码与具体实现细节解耦,使得更换一个产品族变得更为容易。...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象族的接口,而无需指定其具体的类。这种模式的关键在于“族”,即一系列相关的对象。在抽象工厂模式中,我们创建一个抽象工厂接口,然后为每一种具体...
3. **抽象工厂(Abstract Factory)**:这是工厂方法模式的核心,它声明了创建产品对象的工厂方法。这个方法并不直接创建产品,而是由其子类来实现具体的创建过程。 4. **具体工厂(Concrete Factory)**:具体工厂...