本文实例讲述了java使用抽象工厂模式实现的肯德基消费案例。分享给大家供大家参考,具体如下:
一、模式定义
抽象工厂模式提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。
二、模式举例
1 模式分析
我们借用爸爸和儿子到肯德基店消费这一场景来说明这一模式,进行抽象分析后的截图如下
2 抽象工厂模式的静态建模
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