zoukankan      html  css  js  c++  java
  • 工厂模式开篇-介绍+简单工厂

    工厂模式

    工厂设计模式的原则

    1. OCP原则,即系开闭原则。代码应该对扩展开发,对修改关闭。
    2. 依赖抽象原则(面向接口)。类应该尽量依赖接口、或者抽象类。
    3. 不继承非抽象类,就算继承了也尽量不要修改其代码。

    工厂设计模式应用背景

    在对象中,如果要频繁根据条件,创建某类对象,就应该使用工厂设计模式。把创建这类对象的代码(可能变化的代码),与使用这些代码的(客户端)使用端,分离。

    同时,使用了工厂模式,代替new的操作。相当于在引用与对象之间,加了一层缓冲,使得代码的结构更加灵活。

    工厂设计模式

    工厂设计模式分为

    1. 简单工厂(静态工厂)
    2. 工厂方法
    3. 抽象工厂(感觉用得最多的)

    以上三种的核心思想:其实都是讲可能会变化的new的操作,与不变化使用端的代码进行分离。

    简单工厂模式

    案例:一间肠粉店卖肠粉专做外卖,一份肠粉的流程是:

    1. 根据客人订单准备肠粉的材料(虾饺、瘦肉、鸡蛋。。。) prepare
    2. 蒸熟肠粉 cook
    3. 配上美美的酱油 oil
    4. 用外卖盒打包 box

    如果现在要做一个小程序,实现上面的功能,要怎么设计类?

    常规做法

    
    public class CDF {
        String getType(){
            return "egg";
        }
    
        void createOrder(){
            CF order = null;
            String type = this.getType();
            if(type == "egg") {
                order = new EggCF();
            }else if(type == "pork"){
                order = new PorkCF();
            }else if(type == "beef"){
                order = new BeefCF();
            }else{
                System.out.println("本店无此类肠粉");
                return;
            }
    
            //开始做单
            order.prepare();
            order.cook();
            order.oil();
            order.box();
            System.out.println("完成订单");
        }
    }
    

    按照这种做法,每次添加新的肠粉类,就要修改这个CDF类。显然,把变化的部分抽离,又因为要创建对象所以,可以利用简单工厂。

    优化

    public class CFfactory {
        public static CF createCF(String type){
            CF order = null;
            if(type == "egg") {
                order = new EggCF();
            }else if(type == "pork"){
                order = new PorkCF();
            }else if(type == "beef"){
                order = new BeefCF();
            }else{
                System.out.println("本店无此类肠粉");
    
            }
            return order;
        }
    }
    
    
    public class CDF {
        String getType(){
            return "pork";
        }
    
        void createOrder(){
            CF order = CFfactory.createCF(this.getType());
    
            //开始做单
            order.prepare();
            order.cook();
            order.oil();
            order.box();
        }
    }
    

    这样左后,就算添加了新的类型,只要修改factory的代码,和添加一个新的类型就可以。
    同时,如果有多个使用端同时需要CF对象,那么只需要集中修改工厂,不要修改其他的使用端代码。

  • 相关阅读:
    波特率原理【转】
    求助大神!怎样批量删除数据库表中某个字段中同样的一段字符!
    1033. To Fill or Not to Fill (25)
    http协议
    【数据结构与算法】二叉树深度遍历(递归)
    2015届求职经历
    Codeforces Round #245 (Div. 1)——Working out
    泛泰A900 刷4.4专用中文TWRP2.7.1.1版 支持自己主动识别手机版本号(全球首创)
    实现简答LinkedList
    oracle的内存管理(之中的一个)
  • 原文地址:https://www.cnblogs.com/custoyth/p/13267962.html
Copyright © 2011-2022 走看看