1. 创建型模式
1.1 创建型模式?
创建型模式关注点“怎样创建出对象?” ,将对象的创建与使用分离”。其目的,是为了降低系统的耦合度。
1.2 创建型模式有哪些?
创建型模式可以让使用者无需关注对象的创建细节:
- 对象的创建由相关的工厂来完成;(各种工厂模式)
- 对象的创建由一个建造者来完成;(建造者模式)
- 对象的创建由原来对象克隆完成;(原型模式)
- 对象始终在系统中只有一个实例;(单例模式)
1.3 单例模式(Sineleton)
1.3.1 单例模式
所谓单例模式,即一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。
单例特点:
- 某个类只能有一个实例;(构造器私有)
- 它必须自行创建这个实例;(自己编写实例化逻辑)
- 它必须自行向整个系统提供这个实例;(对外提供实例化方法)
1.3.2 单例示例与模型
(1)代码示例
单例的实现-懒汉式、饿汉式
public class Person {
private String name;
private String age;
//懒汉、饿汉
private volatile static Person instance; //饿汉
//构造器私有,外部不能实例化
private Person() {
System.out.println("创建了Person");
}
//提供给外部的方法
//1、public static synchronized Person guiguBoss() 锁太大
//2、双重检查锁+内存可见性(设计模式)
public static Person guiguBoss() {
//如果没有再去创建
if (instance == null) {
synchronized (Person.class) {
if(instance == null){
Person person = new Person();
//多线程问题
instance = person;
}
}
}
return instance;
}
}
(2)模型
1.3.3 单例模式的应用场景
- 多线程中的线程池
- 数据库的连接池
- 系统环境信息
- 上下文(ServletContext)
1.3.4 常见面试题
- 系统环境信息(System.getProperties())?
- Spring中怎么保持组件单例的?
- ServletContext是什么(封装Servlet的信息)?是单例吗?怎么保证?
- ApplicationContext是什么?是单例吗?怎么保证?
- ApplicationContext: tomcat:一个应用(部署的一个war包)会有一个应用上下文
- ApplicationContext: Spring:表示整个IOC容器(怎么保证单例的)。ioc容器中有很多组件(怎么保证单例)
- 数据库连接池一般怎么创建出来的,怎么保证单实例?
1.4 原型模式
1.4.1 原型模式(Prototype)
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。主要是由本体给外部提供一个克隆体进行使用。
1.4.2 示例代码与模型
(1)示例代码
本体实现Cloneable接口类,提供并重写clone()方法,提供一个克隆本体对象的功能给外部进行使用。
/**
* 当前对象是可克隆的
*/
@Data
@Getter
@Setter
@ToString
public class User implements Cloneable {
private String username;
private Integer age;
public User(){
System.out.println("User对象创建");
}
@Override
protected Object clone()throws CloneNotSupportedException{
User user = new User();
user.setUsername(username);
user.setAge(age);
return user;
}
}
外部类调用克隆功能:
//从这个对象快速得到一个克隆体(克隆人)==原型模式
User user = (User) user.clone();
(2)模型
1.4.3 原型模式的应用场景
- 资源优化
- 性能和安全要求
- 一个对象多个修改者的场景。
- 一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时可以考虑使用原型模式拷贝多个对象供调用者使用。
- 深(两个完全对象不一样的【递归克隆】,内容却完全一样)、浅(只是属性赋值)
1.5 工厂模式
1.5.1 工厂模式(Factory)
工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂
1.5.2 简单工厂(Simple Factory)
三个角色:
- Factory:工厂角色, WuLinFactory
- Product:抽象产品角色,Car
- ConcreteProduct:具体产品角色, VanCar、MiniCar
缺点:违背开闭,扩展不易
1.5.3 工厂方法(Factory Method)
四个角色:
- Product:抽象产品
- ConcreteProduct:具体产品
- Factory:抽象工厂
- ConcreteFactory:具体工厂
缺点:系统复杂度增加,产品单一
1.5.4 抽象工厂(Abstract Factory)
1.5.5 工厂模式的退化
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
1.5.6 工厂模式的应用场景
- NumberFormat、SimpleDateFormat
- LoggerFactory:
- SqlSessionFactory:MyBatis
- BeanFactory:Spring的BeanFactory(就是为了造出bean)
1.6 建造者模式(Builder)
1.6.1 建造者模式示例
产品角色(Product):Phone
抽象建造者(Builder):AbstracPhoneBuilder
具体建造者(Concrete Builder):PhoneBuilder
创建的东西细节复杂,还必须暴露给使用者。屏蔽过程而不屏蔽细节
1.6.2 应用场景
- StringBuilder:append(); 给谁append呢?
- Swagger-ApiBuilder:
- 快速实现。Lombok-Builder模式
1.6.3 编写代码的时候使用到了设计模式。类+模式
- xxxFactory
- xxxTemplate
- xxxBuilder
- xxxFacede