-
设计模式的六大原则
- 总原则-开闭原则
- 1、单一职责原则(SRP)
- 2、里氏替换原则(Liskov Substitution Principle)
- 3、依赖倒转原则(Dependence Inversion Principle)
- 4、接口隔离原则(Interface Segregation Principle)
- 5、迪米特法则(最少知道原则)(Demeter Principle)
- 6、合成复用原则(Composite Reuse Principle)
-
三大类
-
创建型
- 工厂方法模式
- 抽象工厂模式
-
单例模式
-
饿汉式
- /**
* @author chenguangjian 饿汉式单例类.在类初始化时,已经自行实例化
* 饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
*/
public class SingletonHungeryMan {
// 私有构造方法
private SingletonHungeryMan() {
}
final private static SingletonHungeryMan ins = new SingletonHungeryMan(); // 这地方直接用static实例变量的方式来保证单例
// 静态工厂方法,线程安全的
public static SingletonHungeryMan getInstance() {
return ins;
}
}
-
线程不安全
- public class SingletonThreadNotSafe {
private static SingletonThreadNotSafe singleton = null;
// Singleton通过将构造方法限定为private避免了类在外部被实例化
private SingletonThreadNotSafe() {
}
public static SingletonThreadNotSafe getInstance() {
if (singleton == null) {
singleton = new SingletonThreadNotSafe();
}
return singleton;
}
}
-
线程安全
- /**
*
*/
package design.pattern.singleton;
/**
* @author chenguangjian
* 这种方式的实现对于线程来说并不是安全的,因为在多线程的环境下有可能得到Singleton类的多个实例。如果同时有两个线程去判断
* (instance ==
* null),并且得到的结果为真,这时两个线程都会创建类Singleton的实例,这样就违背了Singleton模式的原则 。
*
* 实际上在上述代码中,有可能在计算出表达式的值之前,对象实例已经被创建,但是内存模型并不能保证对象实例在第二个线程创建之前被发现。
* 该实现方式主要有两个优点: 由于实例是在 Instance
* 属性方法内部创建的,因此类可以使用附加功能(例如,对子类进行实例化),即使它可能引入不想要的依赖性。
* 直到对象要求产生一个实例才执行实例化;这种方法称为"惰性实例化"。惰性实例化避免了在应用程序启动时实例化不必要的 singleton。
*/
public class SingletonThreadSafe {
private static SingletonThreadSafe singleton = null;
// Singleton通过将构造方法限定为private避免了类在外部被实例化
private SingletonThreadSafe() {
}
/**
* 线程安全的
*
* @return
*/
public static synchronized SingletonThreadSafe getInstance() { // 这样写依然是线程不安全的,当多线程环境下,有可能返回null
if (singleton == null) {
singleton = new SingletonThreadSafe();
}
return singleton;
}
/**
* 双重检查锁定,线程安全的
*
* @return
*/
public static synchronized SingletonThreadSafe getInstance2() {
if (singleton == null) {
synchronized (SingletonThreadSafe.class) {
if (singleton == null) {
singleton = new SingletonThreadSafe();
}
}
}
return singleton;
}
}
-
生成器(建造者)模式
- “遇到多个构造器参数时要考虑用构建器
- 原型模式
-
结构型
- 适配器
- 装饰器
- 代理
- 外观
- 桥接
- 组合
- 享元
-
行为型
- 策略
- 模板方法
- 观察者
- 迭代子
- 责任链
- 命令
- 备忘录
- 状态
- 访问者
- 中介者
- 解释器
- 并发型模式
- 线程池模式