本文实例讲述了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