zoukankan      html  css  js  c++  java
  • 设计模式详解

    1、单例模式

    核心要点

    构造方法私有
    存在由static修饰的返回实例的方法

    优势

    减少创建Java实例所带来的系统开销
    便于系统跟踪单个Java实例的声明周期、实例状态等

    package singleton;
    
    public class Singleton {
        private static Singleton instance;
        private Singleton() {}
        public static Singleton getInstance() {
            if(instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    

    2、简单工厂模式

    要点

    通过工厂类的形式进行解耦合
    依赖关系通过接口解耦合

    优缺点

    让对象的调用者和对象创建过程分离,当对象调用者需要对象时,直接向工厂请求即可;
    避免了对象的调用者和对象的实现类以硬解码方式耦合,提高了系统的可维护性、拓展性
    需要注意的一个陷阱是:当产品修改时,工厂类也要做相应的修改

    package simplefactory;
    
    public class Computer {
        private Output out;
        public Computer(Output out) {
            this.out = out;
        }
        
        public void keyIn(String msg) {
            out.getData(msg);
        }
        
        public void print() {
            out.out();
        }
    }
    
    package simplefactory;
    
    public class OutputFactory {
        public Output getOutput() {
            return new Printer();
        }
    }
    
    package simplefactory;
    
    public interface Output {
        final int MAX_CACHE_LINE=200;
        void getData(String msg);
        void out();
    }
    
    package simplefactory;
    
    
    public class Printer implements Output {
        private String[] printData = new String[MAX_CACHE_LINE];
        private int dataNum = 0;
    
        @Override
        public void getData(String msg) {
            if(dataNum >= MAX_CACHE_LINE) {
                System.out.println("输出队列已满,添加失败");
            } else {
                printData[dataNum++] = msg;
            }
            
        }
    
        @Override
        public void out() {
            while(dataNum > 0) {
                System.out.println("打印机打印:" + printData[0]);
                System.arraycopy(printData, 1, printData, 0, --dataNum);
            }
            
        }
    
    }
    
    package simplefactory;
    
    public class Test {
        public static void main(String[] args) {
            OutputFactory of = new OutputFactory();
            Computer c = new Computer(of.getOutput());
            c.keyIn("hello world");
            c.keyIn("java");
            c.keyIn("spring");
            c.print();
        }
    }
    

    3、工厂方法和抽象工厂

    要点

    • 和简单工厂相比,工厂方法多了一个接口,也就是工厂接口,Ouput子类的工厂类均继承该接口,实现getOutput()方法
    • 当使用工厂方法设计模式时,对象调用者需要与具体的工厂类进行耦合:当需要不同对象时,程序需要调用相应工厂对象的方法来得到所需的对象
    • 对于采用工厂方法的设计架构,客户端代码成功与被调用对象实现了分离,但带来了另一种耦合:客户端代码与不同的工厂类耦合
    • 为了解决上面的耦合,增加一个工厂类,用于创建不同的工厂对象,这个特殊的工厂类被称为抽象工厂类,这种设计模式被称为抽象工厂模式
    // 工厂接口
    package abstractfactory;
    
    import simplefactory.Output;
    /**
     * 
     *TODO output工厂接口
     *
     * @author CaoLei 2018年7月1日下午3:19:36
     * OutputFactory
     */
    public interface OutputFactory {
        
        Output getOutput();
    
    }
    
    
    // 工厂方法,工厂类
    
    package abstractfactory;
    
    import simplefactory.BetterPrinter;
    import simplefactory.Output;
    
    public class BetterPrinterFactory implements OutputFactory {
    
        @Override
        public Output getOutput() {
            return new BetterPrinter();
        }
    
    }
    
    
    // 抽象工厂,抽象工厂类
    package abstractfactory;
    
    public class OutputFactoryFactory {
        public static OutputFactory getOutputFactory(String type) {
            if ("better".equals(type)) {
                return new BetterPrinterFactory();
            } else {
                return new PrinterFactory();
            }
    
        }
    }
    
    
  • 相关阅读:
    Mybatis插入数据时 返回主键
    React 子组件state内数组修改页面不刷新问题
    React 配合echarts使用问题记录
    vue 项目启动报错
    React Ant design table表单与pagination分页配置
    React Cascader组件实现地址选择
    os常用指令
    React 页面间传参
    React Router配置
    react项目 npm run eject报错
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/9251295.html
Copyright © 2011-2022 走看看