Java使用抽象工厂模式实现的肯德基消费案例详解

时间:2021-11-07 03:43:45

本文实例讲述了java使用抽象工厂模式实现的肯德基消费案例。分享给大家供大家参考,具体如下:

一、模式定义

抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。

抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。

二、模式举例

1 模式分析

我们借用爸爸和儿子到肯德基店消费这一场景来说明这一模式,进行抽象分析后的截图如下

Java使用抽象工厂模式实现的肯德基消费案例详解

2 抽象工厂模式的静态建模

Java使用抽象工厂模式实现的肯德基消费案例详解

3 代码示例

3.1 抽象食物的建立

抽象食物——abstractbasefood

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.demo.factory.model;
/**
 * 抽象食物接口
 *
 * @author maofw
 *
 */
public interface ifood
{
  /**
   * 打印输出食物信息
   */
  void printmesage();
}

3.2 建立不同食物的抽象基类

汉堡基类——hamburg

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 生产抽象食物

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 生产具体食物

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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 故事情节展现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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 通过组合的方式使用工厂时。

希望本文所述对大家java程序设计有所帮助。

原文链接:https://blog.csdn.net/chengqiuming/article/details/70139260