设计模式

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

原文地址:https://www.cnblogs.com/wangpan8721/p/13909750.html