基本介绍:
1)简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式
2)简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
3)在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式
4)改进的思路分析
分析:修改代码可以接受,但是如果我们在其他的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处。
思路:把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类即可,其它有创建到Pizza对象的代码就不需要修改了.->简单工厂模式
Pizza订购的类图
代码结构如下:
这里涉及到了5个类型,我这里分别贴出源代码
Pizza类,具体pizza的父类
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 1package factory.simplefactory.pizzastore;
2
3public abstract class Pizza {
4
5 protected String name;
6
7 abstract void prepare();
8
9 void bake(){
10 System.err.println(name + "baking;");
11 }
12
13 void cut(){
14 System.err.println(name + "cutting;");
15 }
16
17 void box(){
18 System.err.println(name + "boxing;");
19 }
20
21 public String getName() {
22 return name;
23 }
24
25 public void setName(String name) {
26 this.name = name;
27 }
28}
29
30
GreekPizza希腊Pizza
1
2
3
4
5
6
7
8
9
10
11 1package factory.simplefactory.pizzastore;
2
3public class GreekPizza extends Pizza {
4 @Override
5 void prepare() {
6 setName("GreekPizza");
7 System.err.println(name + "preparing;");
8 }
9}
10
11
奶酪Pizza
1
2
3
4
5
6
7
8
9
10
11 1package factory.simplefactory.pizzastore;
2
3public class CheessPizza extends Pizza {
4 @Override
5 void prepare() {
6 setName("奶酪Pizza");
7 System.err.println(name + "preparing;");
8 }
9
10}
11
简单工厂类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1package factory.simplefactory.pizzastore;
2
3//简单工厂类
4public class SimpleFactory {
5
6 //根据orderType返回对应的Pizza对象
7 public Pizza createPizza(String orderType){
8 Pizza pizza = null;
9 System.err.println("使用简单工厂模式");
10 if(orderType.equals("greek")){
11 pizza = new GreekPizza();
12 }else if(orderType.equals("cheese")){
13 pizza = new CheessPizza();
14 }
15 return pizza;
16 }
17}
18
19
下单Pizza类
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 1package factory.simplefactory.pizzastore;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStreamReader;
6
7public class OrderPizza {
8
9 //定义一个简单工厂对象
10 SimpleFactory s;
11
12 Pizza pizza = null;
13
14 //构造器
15 public OrderPizza(SimpleFactory simpleFactory){
16 setS(simpleFactory);
17 }
18
19 public void setS(SimpleFactory s) {
20 String orderType = "";//用户输入的
21 this.s = s;
22
23 do{
24 orderType = getType();
25 Pizza pizza = s.createPizza(orderType);
26 if(pizza != null) {
27 pizza.prepare();
28 pizza.bake();
29 pizza.cut();
30 pizza.box();
31 }else{
32 System.err.println("订购pizza失败,没有这种pizza!");
33 }
34 }while (true);
35 }
36
37 private String getType(){
38 try{
39 BufferedReader string = new BufferedReader(new InputStreamReader(System.in));
40 System.err.println("input pizza type:");
41 String str = string.readLine();
42 return str;
43 } catch (IOException e) {
44 e.printStackTrace();
45 return "";
46 }
47 }
48}
49
测试类
1
2
3
4
5
6
7
8
9 1package factory.simplefactory.pizzastore;
2
3public class Main {
4 public static void main(String[] args) {
5 new OrderPizza(new SimpleFactory());
6 }
7}
8
9
这样子,一旦有新的Pizza品种,只需要修改简单工厂类SimpleFactory即可。
补充:
简单工厂模式,也叫静态工厂模式
一般来说,简单工厂模式的create方法一般是使用静态方法
需要对上面的修改2个文件
SimpleFactory 和 OrderPizza
如下:
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 1package factory.simplefactory.pizzastore;
2
3import java.io.BufferedReader;
4import java.io.IOException;
5import java.io.InputStreamReader;
6
7public class OrderPizza {
8
9
10 Pizza pizza = null;
11
12 //构造器
13 public OrderPizza(){
14 setS();
15 }
16
17 public void setS() {
18 String orderType = "";//用户输入的
19 do{
20 orderType = getType();
21 Pizza pizza = SimpleFactory.createPizza(orderType);
22 if(pizza != null) {
23 pizza.prepare();
24 pizza.bake();
25 pizza.cut();
26 pizza.box();
27 }else{
28 System.err.println("订购pizza失败,没有这种pizza!");
29 }
30 }while (true);
31 }
32
33 private String getType(){
34 try{
35 BufferedReader string = new BufferedReader(new InputStreamReader(System.in));
36 System.err.println("input pizza type:");
37 String str = string.readLine();
38 return str;
39 } catch (IOException e) {
40 e.printStackTrace();
41 return "";
42 }
43 }
44}
45
46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1package factory.simplefactory.pizzastore;
2
3//简单工厂类
4public class SimpleFactory {
5
6 //根据orderType返回对应的Pizza对象
7 public static Pizza createPizza(String orderType){
8 Pizza pizza = null;
9 System.err.println("使用简单工厂模式");
10 if(orderType.equals("greek")){
11 pizza = new GreekPizza();
12 }else if(orderType.equals("cheese")){
13 pizza = new CheessPizza();
14 }
15 return pizza;
16 }
17}
18
19