1. 单例模式
场景:唯一的情况。
1: 饿汉式
{
public class Singleton {
//直接在这里创建类实例,只会创建一次
private static Singleton instance = new Singleton();
//私有化构造方法,好在内部控制创建实例的数目
private Singleton(){
}
//定义一个方法来为客户端提供类实例
public static Singleton getInstance(){
return instance;
}
}
- 为了不用创建类而可以直接访问,必须定义为static字段和static get方法
- 为了不被创建,必须设定方法为私有
缺点 :
- 不管用不用到,都直接创建类。不是懒加载
2: 懒汉式
{
public class Singleton {
//初始不创建
private static Singleton instance = null;
private Singleton(){
}
//用到才创建
public static Singleton getInstance(){
if(instance == null){
//二级判断,避免等待锁浪费时间
synchronized(Singleton.class){
//再次检查,避免创建时多个线程创建
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
}
- 优点 懒加载
- 缺点 判断比较多
2. 简单工厂
- 简单工厂的本质是:选择实现
- 接口:将外部功能调用,和内部具体实现分离
- 为了在调用的时候不需要知道具体的实现类,故用到简单
- 这里如果是多个实现的话,需要在createApi中加入参数
- 但是参数也暴露了内容,因此可以通过配置文件 properties 进行配置,并且通过放射获取真正的类创建。
- 角色:工厂,抽象产品,具体产品 体现开闭原则
3. 工厂方法模式
- 工厂方法模式的本质:延迟到子类来选择实现。
- 在简单工厂模式基础上,抽象出工厂类,通过具体工厂类来生成具体实现类。
- 优势,体现了依赖倒置原则,避免了上层对于具体实现的依赖,也便于程序扩展。
- 角色: 抽象工厂,具体工厂,一个抽象产品,具体产品
4. 抽象工厂模式
- 抽象工厂模式的本质:选择产品簇的实现。
- 与工厂模式相比,其实就是在每一个具体实现中,不止生成一个产品,而是生成一个生产线上的多个产品。而这多个产品相互关联。
- 角色: 抽象工厂,具体工厂(含生产线,可生成多个抽象产品),多个抽象产品,具体产品
5. 建造者模式
- 生成器模式的本质:分离整体构建算法和部件构造。用于复杂的生成模型中。
- 生成器模式的主要功能是构建复杂的产品,而且是细化的,分步骤的构建产品
- 角色
- 指导者: 负责具体产品生成步骤,如打鱼,再杀鱼,后晒鱼
- 抽象生成器: 定义产品生成方法。
- 具体生成器: 具体的方法,如怎么打鱼,怎么杀鱼,怎么晒鱼。
6. 原型模式
- 原型模式需要实现一个可以深度clone自身的接口,从而可以通过自身克隆新的原型对象。
- 克隆出来的新的对象实例复制原型实例属性的值
- 浅度克隆:只负责克隆按值传递的数据
- 深度克隆:还负责克隆引用类型的数据
- 原型模式的本质:克隆生成对象。
- 原型模式可以使新生成的对象持有原来对象的部分或全部属性,而不需要在客户端制定。对于一些需要访问数据库啊,远程主机等耗时获取数据的应用,异常有用。