创建类设计模式:
1 单例模式(饿汉式,懒汉式,双检索),下面是一种懒汉实现方式。
public class Singleton {
// 需要加上volatile关键字来保证线程安全 对于双重检测的时候
private static volatile Singleton singleton = null;
private Singleton() {
System.out.println("init class");
}
// 第一种方法: 利用synchronize关键字来实现线程安全
public synchronized static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
// 第二种方法: 双重检测 来确保线程安全 同时将同步块放在方法内减少每次都需要同步加锁带来的消耗
public static Singleton getInstance1() {
if (singleton == null) {
synchronized (singleton) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
第一种方法,使用synchronized关键字来进行线程同步,每次调用都会加锁,而且,单例模式,返回实例的概率要远大于创建实例。所以每次调用方法都执行同步会造成一种资源的浪费。
第二种方法,将同步代码块放在内部,确保了实例为null时才会进行创建实例和同步的过程 ,避免了每次都需要同步带来的消耗。
2 工厂模式。Factory模式最主要的优势在于当创建对象时可提高封装水平。
3 prototype模式。
原型模式属于对象的创建模式。通过给出一个原型对象(通常是抽象类,或者是接口,内部维护clone()方法 )来指明所有创建的对象的类型。通过原型实例创建新的对象,就不需要关心这个实例本身的类型,只需要实现克隆自身的方法,也而无需再去通过new来创建。
结构型设计模式:
1 observer模式。(应用场景,各种Listener。java原生观察者类:java.util.observable, 普通类extends observable成为被观察者,implement observer成为观察者)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
● 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,抽象主题角色又叫做抽象被观察者(Observable)角色。
● 具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者(Concrete Observable)角色。
● 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。
● 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保持一个指向具体主题对象的引用。
2 装饰者模式。
对个体对象功能的扩展,可以看作是继承的一种替代。典型的应用是java IO类。
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filepath)));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
它是作用于对象层次还是类层次?
针对对象层次,动态的给一个对象添加功能扩展。装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
3 责任链模式。
模式的定义:一个请求沿着一条“链”传递,直到该“链”上的某个处理者处理它为止。典型的应用 switch 判断语句:
switch (request) {
case 0: System.out.println("SMBother handle it: " + request);
break;
case 1: System.out.println("Aige handle it: " + request);
break;
case 2: System.out.println("7Bother handle it: " + request);
break;
default:
break;
4 适配器模式。适配器模式将一个类的接口转换成客户期望的另一个接口,让原本不兼容的接口可以合作无间。
适配器模式的三个特点:
1 适配器对象实现原有接口
2 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
3 对适配器原有接口方法的调用被委托给新接口的实例的特定方法
public class SocketAdapter
implements DBSocketInterface{ //实现旧接口
//组合新接口
private GBSocketInterface gbSocket;
/**
* 在创建适配器对象时,必须传入一个新街口的实现类
* @param gbSocket
*/
public SocketAdapter(GBSocketInterface gbSocket) {
this.gbSocket = gbSocket;
}
/**
* 将对就接口的调用适配到新接口
*/
@Override
public void powerWithTwoRound() {
gbSocket.powerWithThreeFlat();
}
}