一 模式定义
- 抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
- 抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。
二 模式举例
1 模式分析
我们借用爸爸和儿子到肯德基店消费这一场景来说明这一模式,进行抽象分析后的截图如下
2 抽象工厂模式的静态建模
3 代码示例
3.1 抽象食物的建立
抽象食物——AbstractBaseFood
package com.demo.factory.model; /** * * 食物基类 * * @author maofw * */ public abstract class AbstractBaseFood { // 类别 protected String kind; // 数量 protected int num; // 价格 protected float price; // 合计 public float totalPrice() { return this.num * this.price; } }
食物接口——IFood
package com.demo.factory.model; /** * 抽象食物接口 * * @author maofw * */ public interface IFood { /** * 打印输出食物信息 */ void printMesage(); }
3.2 建立不同食物的抽象基类
汉堡基类——Hamburg
package com.demo.factory.model; /** * 汉堡基类 * * @author maofw * */ public abstract class Hamburg extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "风味汉堡,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice()); } }
鸡翅基类——ChickenWings
package com.demo.factory.model; /** * 鸡翅基类 * * @author maofw * */ public abstract class ChickenWings extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "风味鸡翅,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice()); } }
薯条基类——FrenchFries
package com.demo.factory.model; /** * 薯条基类 * * @author maofw * */ public abstract class FrenchFries extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "风味薯条,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice()); } }
饮料基类——Beverage
package com.demo.factory.model; /** * 饮料基类 * * @author maofw * */ public abstract class Beverage extends AbstractBaseFood implements IFood { public void printMesage() { System.out.println("--" + this.kind + "饮料,\t单价:" + this.price + ",\t数量:" + this.num + ",\t合计:" + this.totalPrice()); } }
3.3 创建具体的食物
麻辣鸡腿汉堡——ChinaHanburm
package com.demo.factory.model.kfc; import com.demo.factory.model.Hamburg; /** * 中国风味的麻辣鸡腿汉堡 * * @author maofw * */ public class ChinaHanburm extends Hamburg { /** * 构造方法 * * @param kind * @param price * @param num */ public ChinaHanburm(int num) { this.kind = "麻辣"; this.price = 14.0f; this.num = num; } }
奥尔良鸡翅——ChinaChickenWings
package com.demo.factory.model.kfc; import com.demo.factory.model.ChickenWings; /** * 鸡翅实现类 * * @author maofw * */ public class ChinaChickenWings extends ChickenWings { public ChinaChickenWings(int num) { this.kind = "奥尔良"; this.price = 2.5f; this.num = num; } }
薯条——ChinaFrenchFries
package com.demo.factory.model.kfc; import com.demo.factory.model.FrenchFries; /** * 薯条实现类 * * @author maofw * */ public class ChinaFrenchFries extends FrenchFries { public ChinaFrenchFries(int num) { this.kind = "普通"; this.price = 8.0f; this.num = num; } }
可乐——ChinaBeverage
package com.demo.factory.model.kfc; import com.demo.factory.model.Beverage; /** * 饮料实现类 * * @author maofw * */ public class ChinaBeverage extends Beverage { public ChinaBeverage(int num) { this.kind = "可乐"; this.price = 7.0f; this.num = num; } }
3.4 建立工厂
创建抽象肯德基工厂——IKfcFactory 生产抽象食物
package com.demo.factory.itf; import com.demo.factory.model.Beverage; import com.demo.factory.model.ChickenWings; import com.demo.factory.model.FrenchFries; import com.demo.factory.model.Hamburg; /** * 肯德基抽象工厂基类 * * @author maofw * */ public interface IKfcFactory { // 生产汉堡 public Hamburg createHamburg(int num); // 生产薯条 public FrenchFries createFrenchFries(int num); // 生产鸡翅 public ChickenWings createChickenWings(int num); // 生产饮料 public Beverage createBeverage(int num); }
创建具体肯德基工厂——ChinaKfcFactory 生产具体食物
package com.demo.factory.itf; import com.demo.factory.model.Beverage; import com.demo.factory.model.ChickenWings; import com.demo.factory.model.FrenchFries; import com.demo.factory.model.Hamburg; import com.demo.factory.model.kfc.ChinaBeverage; import com.demo.factory.model.kfc.ChinaChickenWings; import com.demo.factory.model.kfc.ChinaFrenchFries; import com.demo.factory.model.kfc.ChinaHanburm; public class ChinaKfcFactory implements IKfcFactory { // 生产可乐 public Beverage createBeverage(int num) { return new ChinaBeverage(num); } // 生产奥尔良烤鸡翅 public ChickenWings createChickenWings(int num) { return new ChinaChickenWings(num); } // 生产薯条 public FrenchFries createFrenchFries(int num) { return new ChinaFrenchFries(num); } // 生产麻辣风味鸡腿汉堡 public Hamburg createHamburg(int num) { return new ChinaHanburm(num); } }
3.5 创建客户类——Customer
package com.demo.factory.custom; import com.demo.factory.itf.IKfcFactory; import com.demo.factory.model.Beverage; import com.demo.factory.model.ChickenWings; import com.demo.factory.model.FrenchFries; import com.demo.factory.model.Hamburg; /** * 客户类 * * @author maofw * */ public class Customer { // 抽象工厂 private IKfcFactory kfcFactory; // 构造方法将抽象工厂作为参数传入 public Customer(IKfcFactory kfcFactory) { this.kfcFactory = kfcFactory; } /** * 订购食物 */ // 订购麻辣鸡腿汉堡 public float orderHamburg(int num) { // 获得麻辣鸡腿汉堡 Hamburg hamburg = kfcFactory.createHamburg(num); // 输出订购信息 hamburg.printMesage(); // 返回总价 return hamburg.totalPrice(); } // 订购奥尔良烤鸡翅 public float orderChickenWings(int num) { // 获得奥尔良烤鸡翅 ChickenWings chickenWings = kfcFactory.createChickenWings(num); // 输出订购信息 chickenWings.printMesage(); // 返回总价 return chickenWings.totalPrice(); } // 订购薯条 public float orderFrenchFries(int num) { // 获得薯条 FrenchFries frenchFries = kfcFactory.createFrenchFries(num); // 输出订购信息 frenchFries.printMesage(); // 返回总价 return frenchFries.totalPrice(); } // 订购可乐 public float orderBeverage(int num) { // 获得可乐 Beverage beverage = kfcFactory.createBeverage(num); // 输出订购信息 beverage.printMesage(); // 返回总价 return beverage.totalPrice(); } }
3.6 故事情节展现
package com.demo.factory; import java.lang.management.ManagementFactory; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.text.NumberFormat; import java.util.Arrays; import java.util.Calendar; import java.util.ResourceBundle; import com.demo.factory.custom.Customer; import com.demo.factory.itf.ChinaKfcFactory; import com.demo.factory.itf.IKfcFactory; public class MainApp { /** * 主应用程序方法 * * @param args */ public static void main(String[] args) { /** * 定义一个肯德基(IKfcFactory类型) */ IKfcFactory kfcFactory = new ChinaKfcFactory(); /** * 爸爸和儿子走进肯德基,准备点餐 */ Customer customer = new Customer(kfcFactory); /** * 开始点餐 */ // 一个麻辣鸡腿汉堡 float hamhurgMoney = customer.orderHamburg(1); // 四个奥尔良烤鸡翅 float chickenWingsMoney = customer.orderChickenWings(4); // 一包薯条 float frenchFriesMoney = customer.orderFrenchFries(1); // 两杯可乐 float beverageMoney = customer.orderBeverage(2); System.out.println("总计:" + (hamhurgMoney + chickenWingsMoney + frenchFriesMoney + beverageMoney)); } }
运行结果:
--麻辣风味汉堡, 单价:14.0, 数量:1, 合计:14.0
--奥尔良风味鸡翅, 单价:2.5, 数量:4, 合计:10.0
--普通风味薯条, 单价:8.0, 数量:1, 合计:8.0
--可乐饮料, 单价:7.0, 数量:2, 合计:14.0
总计:46.0
三 该模式的设计原则
1 多用对象组合,少用继承
2 针对抽象编程,不针对实现编程
3 产品对象通过工厂暴露的方法创建
四 使用场合
1 创建产品家族,相关产品集合在一起使用的时候;
2 想要提供一个产品类库,并只想显示其接口而不是实现时;
3 通过组合的方式使用工厂时。
相关推荐
C#中的工厂模式分为简单工厂、抽象工厂和单例模式三种,每一种都有其特定的应用场景和优势。 1. **简单工厂模式**: 简单工厂模式是一种静态工厂方法,它创建一个具体的对象而无需暴露创建逻辑。在C#中,我们可以...
### C#工厂模式详解——简单工厂与抽象工厂实例解析 #### 一、工厂模式概述 工厂模式是一种常用的设计模式,在面向对象编程中被广泛应用于创建对象。它通过提供一个统一的接口来创建一系列相关的或相互依赖的对象...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体类。这种模式的主要目的是为了隔离产品对象的创建和使用,使得系统对产品类的依赖降低到最低,同时也方便了产品的扩展和...
通过把肯德基生产各种食物的过程类比为工厂生成产品的过程,帮助我们理解抽象工厂模式的工作原理。 在肯德基的故事中,肯德基店作为生产食物的工厂,能够生产多种不同的食物,例如麻辣鸡腿汉堡、奥尔良烤鸡翅、薯条...
工厂模式分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 1. **简单工厂模式** 简单工厂模式是最简单的工厂模式实现,它提供一个静态方法或者类来创建对象,这个类通常被称为“工厂”。用户只需要...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许系统独立于如何创建、组合和表示产品对象的细节进行设计,为产品族(一组相关或相互依赖的对象)提供...
java设计模式 抽象工厂模式详解 一张图让你彻底明白抽象工厂模式
抽象工厂模式是设计模式中的一种,它提供了一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在软件工程中,当系统需要在运行时选择不同的产品族时,或者想要隔离具体产品的实现细节时,抽象工厂...
在学习和应用抽象工厂模式时,理解其核心思想——封装变化和解耦,以及如何在实际项目中选择合适的场景使用这一模式,是非常关键的。对于软件工程专业的学生来说,掌握这一模式不仅可以提升编程能力,还能提高对软件...
在软件设计模式中,工厂模式是一组非常基础且实用的设计模式,主要分为简单工厂模式、工厂方法模式和抽象工厂模式。这些模式都是为了解决对象创建的问题,通过封装对象的创建过程,使得代码更加灵活,易于扩展和维护...
本文将探讨三个重要的设计模式:抽象工厂模式、工厂方法模式以及策略模式,并结合一个实际的场景——手机加工厂,来具体阐述它们的应用。 首先,我们来看**抽象工厂模式**。这个模式主要用于创建相关或依赖对象的...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一种创建对象集合的接口,而无需指定具体的类。这种模式允许客户端使用一个通用接口来创建一组相关或相互依赖的对象,而无需关心它们的具体实现。在Java或其他...
工厂方法模式和抽象工厂模式是两种常见的设计模式,它们都属于创建型模式,用于解决对象的创建问题。在软件设计中,这两种模式都是用来隔离对象的创建和使用,以提高系统的灵活性和可扩展性。 首先,工厂方法模式的...
抽象工厂模式是一种设计模式,属于创建型模式,它提供了一种创建对象集合的方式,这些对象来自相关联的产品家族,而且每个对象都属于不同的抽象产品类。在“格斗类游戏软件”的场景中,这个模式可以帮助我们根据玩家...
Android之大话设计模式——:抽象工厂模式借鉴.pdf
Android之大话设计模式——:抽象工厂模式参考.pdf
设计模式 - 抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种方式来创建一组相关或相互依赖的对象,而不需要指定具体的类。该模式允许客户端使用抽象的接口来创建一组相关的产品,而不需要关系实际...
抽象工厂模式是软件设计模式中的一种,属于创建型模式,它的主要目的是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。在实际应用中,当我们需要创建一组具有共同特性的对象,而这些对象分别...
抽象工厂模式是设计模式中的一种创建型模式,它提供了一个创建对象族的接口,而无需指定它们的具体类。在.NET开发中,这种模式常用于实现多数据库连接,比如连接到MySQL、SQL Server或Oracle等不同的数据库系统。...
### 抽象工厂模式简介与应用实例 #### 一、抽象工厂模式定义 抽象工厂模式是一种创建型设计模式,它能够让我们从一个公共接口中创建一系列相关或相互依赖的对象,而无需指定它们的具体类。该模式的核心在于提供了...