设计模式之简单工厂模式

释放双眼,带上耳机,听听看~!

基本介绍:

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

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

MongoDB最简单的入门教程之二 使用nodejs访问MongoDB

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索