zoukankan      html  css  js  c++  java
  • 设计模式之简单工厂模式

    设计模式之简单工厂模式

    本篇博客参考以下文章:

    工厂模式--简单工厂模式

    基本介绍

    • 简单工厂模式属于创建型模式,是工厂模式的一种,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单实用的模式
    • 简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)
    • 在软件开发中,当我们会用到大量的创建某种、某类或某批对象时,就会用到工厂模式

    使用简单工厂模式

    1.看一个简单的需求

    看一个披萨的项目:要便于披萨种类的扩展,要便于维护

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

    2.绘制UML类图

    image-20201026140641470

    • Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
    • IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
    • Product:具体产品类,是简单工厂模式的创建目标。

    3.编写代码

    抽象类Pizza以及实现Pizza的三个子类

    /**
     * @author gaoteng
     * 将Pizza类做成抽象
     */
    public abstract class Pizza {
        /**
         * 名字
         */
        protected String name;
        /**
         *准备原材料, 不同的披萨不一样,因此,我们做成抽象方法
         */
        public abstract void prepare();
        /**
         * 烘烤
         */
        public void bake() {
            System.out.println(name + " baking;");
        }
    
        /**
         * 切片
         */
        public void cut() {
            System.out.println(name + " cutting;");
        }
        /**
         * 打包
         */
        public void box() {
            System.out.println(name + " boxing;");
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    
    /**
     * @author gaoteng
     * 奶酪披萨
     */
    public class CheesePizza extends Pizza {
        @Override
        public void prepare(){
            System.out.println("给制作奶酪披萨,制作原料!");
        }
    }
    
    
    /**
     * @author gaoteng
     * 希腊披萨
     */
    public class GreekPizza extends Pizza {
    
        @Override
        public void prepare() {
            System.out.println("给希腊披萨准备原材料");
        }
    }
    
    
    /**
     * @author gaoteng
     * 胡椒披萨
     */
    public class PepperPizza extends Pizza{
        @Override
        public void prepare() {
            System.out.println("给胡椒披萨准备原材料");
        }
    }
    

    简单工厂类

    /**
     * @author gaoteng
     * 简单工厂类
     */
    public class SimpleFactory {
        //简单工厂模式 也叫 静态工厂模式
        public static Pizza createPizza(String orderType) {
    
            Pizza pizza = null;
    
            System.out.println("使用简单工厂模式");
            if (orderType.equals("greek")) {
                pizza = new GreekPizza();
                pizza.setName(" 希腊披萨 ");
            } else if (orderType.equals("cheese")) {
                pizza = new CheesePizza();
                pizza.setName(" 奶酪披萨 ");
            } else if (orderType.equals("pepper")) {
                pizza = new PepperPizza();
                pizza.setName("胡椒披萨");
            }
    
            return pizza;
        }
    }
    
    

    4.客户端测试

    /**
     * @author gaoteng
     * 订单披萨类
     */
    public class OrderPizza {
        public static void main(String[] args) {
            Pizza cheese = SimpleFactory.createPizza("cheese");
            System.out.println(cheese.name);
        }
    }
    

    image-20201026141331083

    5.优缺点以及应用场景

    优点:

    • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象
    • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
    • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

    缺点:

    • 由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
    • 使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
    • 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,同样破坏了“开闭原则”;在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护

    适用环境:

    • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
    • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数
  • 相关阅读:
    Android将ScrollView移动到最底部
    Android权限之sharedUserId和签名
    python接口使用及工具函数
    python模块(json、os、sys、random、string、time、hashlib)
    python内置函数
    python模块、函数变量及递归
    python数据类型集合及函数
    python文件操作及修改
    python字符类型操作及文件操作
    jmeter压测
  • 原文地址:https://www.cnblogs.com/gttttttt/p/13878281.html
Copyright © 2011-2022 走看看