`
cakin24
  • 浏览: 1410086 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

抽象工厂模式——肯德基消费

阅读更多

一 模式定义

  • 抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
  • 抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。

二 模式举例
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 通过组合的方式使用工厂时。

  • 大小: 18.4 KB
  • 大小: 81.5 KB
分享到:
评论

相关推荐

    设计模式与泡MM——设计模式入门教程

    这样一来,快餐店就成了一个抽象工厂,而MM的选择则决定了最终的产品。 ##### 4、PROTOTYPE(原型模式) 原型模式通过拷贝一个已存在的实例来创建新的实例,而不是通过创建对象的类。 **例子**:与MM聊天时,为了...

    追MM“23式”—— GOF 23种设计模式

    ”这里的麦当劳和肯德基就相当于工厂模式中的工厂。客户(即你)与工厂(即快餐店)分离,客户只需要提出需求,而不需要关心具体是如何制作出来的。 - **优点**:消费者可以随时接纳新产品,无需对现有代码进行更改...

    设计模式与现实生活,形象,生动

    这就像工厂模式中,消费者只需要知道最终的产品是什么,而具体的实现细节则由工厂来处理。这种模式使得增加新的产品变得简单,只需要在工厂中添加相应的生产逻辑即可。 **2. 建造者模式(Builder)** 建造者模式...

    C#23种设计模式_示例源代码及PDF

    工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...

    追MM与设计模式.pdf

    ### 追MM与设计模式——IT知识解析 #### 创建型模式 ##### 1. 工厂模式 (FACTORY) **定义**: 客户类和工厂类分离,消费者只需要向工厂请求所需的产品,无需关心产品的具体实现。 **示例**: 在追MM的过程中,请MM...

    23设计模式简讲

    - **模式定义**:抽象工厂模式是一种创建型设计模式,它能让用户创建一系列相关或相互依赖的对象,而无需指定其具体类。 2. **BUILDER** - **场景解析**:要追求不同地区的MM,就需要学会说不同语言的“我爱你”...

    设计模式_通俗易懂

    工厂模式是一种常用的创建型设计模式,它的核心思想是将产品的创建过程封装起来,使得客户端无需关心具体的创建逻辑,只需要向工厂请求产品即可。这种方式可以使得消费者无须修改代码就能接纳新产品。 **例子说明**...

Global site tag (gtag.js) - Google Analytics