VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • 设计模式(二)——Java简单工厂模式

简单工厂模式

案例:

披萨的项目(要便于披萨种类的扩展,要便于维护)

1)披萨的种类很多(比如 GreekPizz、CheesePizz 等)
2)披萨的制作有 prepare,bake, cut, box
3)完成披萨店订购功能。

使用传统的方式来完成

 

 

 

编写 OrderPizza.java 去订购需要的各种 Pizza

Pizza类

复制代码
package com.lin.simplefactory;

public class SimpleFactoryDemo {

}

abstract class Pizza{
    
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void prepare() {
        System.out.println(name + " are prepared!");
    }
    
    public void bake() {
        System.out.println(name + " are baked!");
    }
    
    public void cut() {
        System.out.println(name + " are cutted!");
    }
    
    public void box() {
        System.out.println(name + " are boxed!");
    }
    
}

// chesspizza
class ChessPizza extends Pizza{

}

// greekpizza
class GreekPizza extends Pizza{
    
}

// chinapizza
class ChinaPizza extends Pizza{
    
}
复制代码

OrderPizza类

复制代码
package com.lin.simplefactory;


import java.util.Scanner;
/**
 *     假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低

 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:29:26 
 * @version V1.8
 */
public class OrderPizza {
    
    public OrderPizza(){
        Pizza pizza = null;
        String orderType;
        while(true) {
            orderType = getType();
            if(orderType.equals("chess")) {
                pizza = new ChessPizza();
                pizza.setName("chesspizza");
            } else if(orderType.equals("greek")) {
                pizza = new GreekPizza();
                pizza.setName("greekpizza");
            } else if(orderType.equals("china")) {
                pizza = new ChinaPizza();
                pizza.setName("chinapizza");
            } else {
                break;
            }
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
        }
    }public String getType() {
       
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}
复制代码

PizzaStore类

复制代码
package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
        new OrderPizza();
    }
}
复制代码

 传统的方式的优缺点

1)优点是比较好理解,简单易操作。

2)缺点是违反了设计模式的 ocp 原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,尽量不修改代码,或者尽可能少修改代码.
3)比如我们这时要新增加一个 Pizza 的种类(Pepper 披萨),我们需要做如下修改. 如果我们增加一个 Pizza 类,只要是订购 Pizza 的代码都需要修改.

改进的思路分析

分析:修改代码可以接受,但是如果我们在其它的地方也有创建 Pizza 的代码,就意味着,也需要修改,而创建Pizza

的代码,往往有多处。

思路:把创建 Pizza 对象封装到一个类中,这样我们有新的 Pizza 种类时,只需要修改该类就可,其它有创建到 Pizza

对象的代码就不需要修改了.-> 简单工厂模式

基本介绍

1) 简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。

2) 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。

3) 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。

使用简单工厂模式

简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类,封装创建对象的代码。

 

 

 Pizza类不变

OrderPizza类

复制代码
package com.lin.simplefactory;


import java.util.Scanner;
/**
 *     假如有很多orderpizza,如果增加一种pizza种类,修改就很麻烦,效率低

 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:29:26 
 * @version V1.8
 */
public class OrderPizza {
    
        //定义一个工厂对象
        public SimpleFactory factory = null;
        public Pizza pizza = null;

        // 构造器
        public OrderPizza(SimpleFactory factory) {
            setFactory(factory);
        }
        public void setFactory(SimpleFactory factory) {
            String type = "";
            this.factory = factory;
            while(true) {
                type = getType();
                pizza = this.factory.createPizza(type);
                
                if(pizza != null) {
                    pizza.prepare();
                    pizza.bake();
                    pizza.cut();
                    pizza.box();
                } else {
                    System.out.println("没有这种披萨!");
                    break;
                }
            }
        }


    public String getType() {
       
        Scanner str = new Scanner(System.in);
        System.out.println("please input the type of ordered pizza:");
        String type = str.next();
        return type;
    }
}
复制代码

增加一个类--SimpleFatcory类

复制代码
package com.lin.simplefactory;
/**
 *     简单工厂模式

 * @Description: 
 * @author LinZM  
 * @date 2021-2-3 0:28:04 
 * @version V1.8
 */
public class SimpleFactory {

    public Pizza createPizza(String orderType) {
        Pizza pizza = null;
        
        System.out.println("使用简单工厂模式");
        if(orderType.equals("chess")) {
            pizza = new ChessPizza();
            pizza.setName("chesspizza");
        } else if(orderType.equals("greek")) {
            pizza = new GreekPizza();
            pizza.setName("greekpizza");
        } else if(orderType.equals("china")) {
            pizza = new ChinaPizza();
            pizza.setName("chinapizza");
        } 
        return pizza;
    }
}
复制代码

PizzaStore类

复制代码
package com.lin.simplefactory;

public class PizzaStore {

    public static void main(String[] args) {
//        new OrderPizza();
        new OrderPizza(new SimpleFactory());
    }
}
复制代码

同时,简单工厂模式又叫静态工厂模式,在OrderPizza类中将creatPizza改为static,在后面使用类.方法名方式调用该方法。

 

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

蓝天和白云是标配。

原文:https://www.cnblogs.com/linzm14/p/14365015.html

相关教程