1,概述:
设计模式是解决问题的方案,学习现有的设计模式可以做到经验复用
2,创建型模式
2.1,单例模式:
①懒汉式--线程不安全
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
懒汉:到用的时候才实例化(类未调用,不用实例化)--延迟实例化,节省空间。
问题:如果同时有几个线程进入if语句块,则将会被实例化几次。
②饿汉式--线程安全,
public class Singleton {
private static Singleton uniqueInstance= new Singleton();
private Singleton() {
}
public static Singleton getUniqueInstance() {
return uniqueInstance;
}
}
饿汉:先吃再说,先实例化,用了直接拿;
问题:避免了线程不安全导致的多次实例化,但也丢失了延迟实例化带来节约资源的好处。
③懒汉式--线程安全
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {
}
public static synchronized Singleton getUniqueInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
只需要对,getUniqueInstance() 方法加锁,就只有一个线程能进入实例化代码块了。
问题:线程抢锁导致阻塞问题,性能不高。
④双重校验锁--线程安全
因为单例对象只需要实例化一次,解决③性能问题只需将锁加在实例化代码块上。
public class Singleton {
private volatile static Singleton uniqueInstance; ----volatile通过禁止指令重排序,保证多线程下正常运行。
private Singleton() {
}
public static Singleton getUniqueInstance() {
if (uniqueInstance == null) {
synchronized(Singleton.class){
if(uniqueInstance == null) ----双重校验,防止延迟实例化导致多次实例化问题
uniqueInstance = new Singleton();
}
}
return uniqueInstance;
}
}
⑤静态内部类实现
当Singleton类加载时,静态内部类SingletonHolder并没有被加载进内存。当调用getUniqueInstance()方法
访问SingletonHolder.INSTANCE 时触发SingletonHolder 类加载。且JVM保证线程安全和保证INSTANCE只被实例化一次。
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getUniqueInstance() {
return SingletonHolder.INSTANCE;
}
}
⑥枚举类实现
public enum Singleton {
INSTANCE;
private String objName;
public String getObjName() {
return objName;
}
public void setObjName(String objName) {
this.objName = objName;
}
}
2.2,简单工厂模式:
- 在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
- 简单工厂把实例化操作单独放到一个类中,称为简单工厂类,让简单工厂决定实例化哪个子类。如子类改变了,
修改简单工厂类而不用修改客户端。
2.3,工厂方法:
- 定义了一个创建对象的接口,但由子类决定要实例化哪个类,工厂方法把实例化操作推迟到子类
2.4,抽象工厂:
3,结构性模式:
3.1,适配器模式:
3.2,桥接模式:
3.3,装饰者模式:JAVA设计模式初探之装饰者模式
- 为对象动态添加功能
- 装饰者(如:FilterIputStream)与具体组件(如:FileInputStream---BufferedInputStream)都继承至组件(InputStream)
具体组件的方法实现不需要依赖其他对象,而装饰者组合了一个组件,这样可以装饰一个组件,
所谓装饰即扩展被装饰者的功能。
- 例如实例化一个具有缓冲功能的字节流对象,只需要在FileInputStream对象再套一次BufferedInputStream对象即可
FileInputStream file=new FileInputStream(filePath);
BufferedInputStream bufferInputStream =new BufferedInputStream(file);
参考:
https://www.cnblogs.com/pony1223/p/7608955.html