简介
23种设计模式 主要类别如下:
创建型:
创建对象时,不再由我们直接实例化对象;而是根据特定场景,由程序来确定创建对象的方式,从而保证更大的性能、更好的架构优势。
工厂模式、单例模式、生成器模式、原型模式
结构型:
用于帮助将多个对象组织成更大的结构。
结构型模式主要有适配器模式adapter、桥接模式bridge、组合器模式component、装饰器模式decorator、门面模式、亨元模式flyweight和代理模式proxy。
行为型:
用于帮助系统间各对象的通信,以及如何控制复杂系统中流程。行为型模式主要有命令模式command、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式state、策略模式、模板模式和访问者模式。
单例模式
实现单例模式需要三步:
- 将构造函数私有化
- 在类的内部创建实例
- 提供获取唯一实例的方法
单例模式分为饿汉式和简单懒汉式
1. 饿汉式
//饿汉式(直接创建出一个对象,并返回)
public class Singleton{
//私有化构造函数
private Singleton(){
}
//创建对象
private static Singleton ins=new singleton();
//返回唯一对象
public static Singleton getInstance(){
return ins;
}
}
缺点:一上来就创建对象,如果没有用过会造成内存浪费
2. 简单懒汉式
//懒汉式
public class Singleton{
//私有化构造函数
private Singleton(){}
//先不创建对象,等用到的时候再创建
private static volatile Singleton ins=null; //避免重排序,volatile有内存屏障的功能
//调用到这个方法了,证明是要被用到的了
public static Singleton getInstance(){
if(ins==null){ //这个判断主要为了提高性能
synchronized(Singleton.class){ //使用synchronized将锁的范围缩小,提高性能
if(ins==null){ //再判断一次是否为null(主要的判断)
ins=new Singleton();
}
}
}
return ins;
}
}
单例模式应用场景:
1.资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
2.控制资源的情况下,方便资源之间的互相通信。如线程池等。
例子:
1、网站的计数器,一般也是采用单例模式实现,否则难以同步。
2、据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
工厂模式
简单工厂模式(并不是23种模式中的)
参考的Head first 设计模式
工厂处理创建对象的细节。一旦有了SimplePizzaFactory,orderPizza()就变成此对象的客户。当需要披萨,就要pizza工厂做。
orderPizza()方法只需要关心从工厂得到一个披萨。
工厂方法模式
提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例。
工厂方法模式通过让子类决定该创建的对象是什么,最终达到将对象创建的过程封装的目的。
代码可以参考:
https://github.com/TanDawn1/DesignPattern
工厂模式应用场景:
SpringIOC参照的就是工厂模式创建Bean