https://blog.csdn.net/jason0539/article/details/44956775
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
详细
① 单一职责原则
② 里氏替换原则
③ 依赖倒转原则
④ 接口隔离原则
⑤ 迪米特法则/最少知道
⑥ 合成复用原则
① 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
② 结构型模式:适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式
③ 行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
还有两类:并发型模式和线程池模式。
https://blog.csdn.net/jason0539/article/details/23297037
单例模式有以下特点:
① 单例类只能有一个实例。
② 单例类必须自己创建自己的唯一实例。
③ 单例类必须给所有其他对象提供这一实例。
懒汉式单例:
//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {
private Singleton() {}
private static Singleton single=null;
//静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
1、在getInstance方法上加同步,一次检查
public static synchronized Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
2、双重检查锁定
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
3、静态内部类
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
这种比上面1、2都好一些,既实现了线程安全,又避免了同步带来的性能影响。
饿汉式单例:
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
总结:单例模式是一种创建型设计模式,要求一个类只有一个实例,这个实例由自己创建且必须提供给其他对象这一实例。
一般用在:
1.需要频繁实例化然后销毁的对象
2.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
主要有3种形式懒汉,饿汉和枚举
饿汉模式一加载就创建号实例,会损耗不必要的内存。但他是线程安全的。懒汉模式在需要是时候才创建实例,但如果请求时间相同有线程安全的问题,解决线程安全有三种模式,加锁同步,双重加锁同步和静态内部类,第一个有漏洞,第二个耗性能,所以一般用第三个定一个静态内部类,内部类中有一个静态属性持有外部类对象。这样在类被加载的时候内部类,创建好了一个静态属性而且这个属性指向一个外部类对象。每次外部类调用方法时其实就是获取内部类中的静态属性。
枚举能实现单例模式,但一般用于定义数据,需要的数据不能是任意的,而必须是一定范围内的值,Java5以后可以直接使用枚举予以解决。
比如: 方向 , 性别 、 季节 、 星期…
https://blog.csdn.net/jcsyl_mshot/article/details/79845732
在工厂模式中,我们在创建对象/产品时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象/产品。
根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。
一句话总结工厂模式:方便创建 同种产品类型的 复杂参数 对象
总结:
工厂模式重点就是适用于 构建同产品类型(同一个接口 基类)的不同对象时,这些对象new很复杂,需要很多的参数,而这些参数中大部分都是固定的,so,懒惰的程序员便用工厂模式封装之。
(如果构建某个对象很复杂,需要很多参数,但这些参数大部分都是“不固定”的,应该使用Builder模式)Builder: https://blog.csdn.net/u011240877/article/details/53248917
为了适应程序的扩展性,拥抱变化,便衍生出了 普通工厂、抽象工厂等模式。
4.3代理