创建型模式
提供了一种在创建对象的同时隐藏创建逻辑的方法,而不是使用new运算符直接实例化对象。
1. 单例模式
- 定义:
如果一个类始终只能创建一个实例,则这个类被称为单例类,这种模式就被称为单例模式。 - 单例模式优点:
减少创建Java实例所带来的系统开销
便于系统跟踪单个Java实例的生命周期、实例状态等。 - 例子:
比如电脑的任务管理器,只要开一个就好了 - 特点:
1)单例类只有一个实例。
2)单例类必须自己实例化自己,在类中包含实例化,构造器私有。
3)单例类需要向外提供实例的方法。 - 创建方式:
1)懒汉式:调用方法才进行初始化
public class Singleton {
private static Singleton instance;
private Singleton (){}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2)饿汉式:类加载时就进行初始化
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
3)双检锁/双重校验锁(DCL,即 double-checked locking)(更安全的方法)
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
2. 工厂模式
2.0 特点
1)可以使代码结构清晰,有效地封装变化
2)对调用者屏蔽具体的产品类
3)降低耦合度
2.1 简单工厂模式
1)创建一个形状接口(里面定义形状)
2)创建多个实现形状接口的实现类(长方形,正方形和圆心)
3)创建一个工厂类,生成基于给定信息的实体对象。
4)创建工厂类实例,给定信息,就能够得到给定的实体对象。
- 特点:
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
创建实例的工作与使用实例的工作分开,使用者不必关心类对象如何创建,实现了解耦;
比如:我需要购买一部手机,我不需要知道手机是怎么做出来的,进入创建一个手机工厂类,把手机的品牌放进去,就能够获得指定手机对象。
- 特点:
一个抽象产品接口,多个具体产品实现类,一个具体工厂类,进行产品对象生成;
1)每个工厂可以创建多个产品实例,当需要创建新产品的时候,需要修改工厂类,不符合java开闭原则
2)用户需要什么类型的产品,告诉工厂类,工厂类就创建什么类型的产品实例。
3)如果需要添加产品,那么就需要额外添加产品实现类和修改具体工厂类
2.2 工厂模式
1个抽象产品类,多个具体产品类,一个抽象工厂类,多个具体工厂类(每个工厂类实生产一种产品)
1)每个工厂只能创建1个产品实例,当需要创建新产品的时候,需要扩展抽象工厂类,而不需要修改,符合java开闭原则
2)用户需要什么类型的产品,就从什么类型的工厂生产
3)如果需要添加产品,那么需要添加产品实现类和具体工厂实现类,很多很烦,虽然解耦了
2.3 抽象工厂模式(有一点难理解)
多个抽象产品类,多个具体产品类,1个抽象工厂类(包含多个抽象产品类),多个具体工厂类(能实现多个抽象产品的某些产品)
1)每个工厂可以创建多个产品实例,当需要创建新产品的时候,需要扩展抽象工厂类,而不需要修改,符合java开闭原则
2)用户需要什么类型的产品,就从什么类型的工厂生产
3)用于生产一组相关或者相互依赖的产品
更加方便,只需要添加集体工厂类,就能实现很大功能。
结构型模式
这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。
3. 代理模式
动态代理和静态代理。