设计模式详解

Posted caoleicoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式详解相关的知识,希望对你有一定的参考价值。

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();
        }

    }
}

以上是关于设计模式详解的主要内容,如果未能解决你的问题,请参考以下文章

架构师内功心法,只是单纯听说过的原型模式详解

详解 Scala 模式匹配

(转) Java中的负数及基本类型的转型详解

详解Android WebView加载html片段

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

Python中verbaim标签使用详解