《Spring5核心原理与30个类手写实战》阅读笔记
目录
PART1 Spring中常用的设计模式
PART2 简单工厂模式
PART1 Spring中常用的设计模式
工厂,装饰者,代理,委派,策略,适配器,模板,观察者模式。
设计模式非独立使用,实际运用中通常为多个设计模式混合。
本文主要是三种工厂模式的学习笔记(简单工厂模式,工厂方法模式,抽象工厂模式)
PART2 简单工厂模式
由一个工厂对象决定创建哪一种类的实例,简单工厂模式适用于工厂类负责创建对象较少的场景,传入工厂类的参数,由工厂类来创建对象。、
理解:将参数传给一个作为工厂的类,让它来统一实例化对象,这样客户端代码就会简洁些。
实例:果汁工厂
1.当不使用工厂模式时,定义一个获取果汁的接口
Public interface IJuice{
public void madeJuice();
}
2、创建一个果汁类实现果汁接口
public Class AppleJuice implements Ijuice {
public void madeJuice(){
System.out.println("制作苹果汁")
}
}
3.客户端调用苹果汁类制作苹果汁
public static void main(String[] args){
//父类Ijuice指向子类的引用
Ijuice juice = new AppleJuice();
juice.madeJuice();
}
4.此时如果需要新增香蕉汁等,客户端要增加对应的果汁子类的引用,会导致客户端代码越来越多,于是此处应该减少依赖,把创建交给一个工厂来处理,发送对应的请求,获取对应的果汁
//新增香蕉果汁类
public Class BananaJuice implements Ijuice {
public void madeJuice(){
System.out.println("制作香蕉汁")
}
}
5.创建果汁工厂
public class JuiceFactory {
public Ijuice madeJuice(String name){
if("Apple".equals(name)){
return new AppleJuice();
}else if("Banana".equals(name)){
return new BananaJuice();
}
}
}
//修改客户端调用代码为
public static void main(String[] args){
//父类Ijuice指向子类的引用
JuiceFactory factory = new JuiceFactory();
factory.madeJuice("Apple");
}
6.此时客户端调用变简单了,但业务继续拓展,每次都要去修改工厂的代码,也不符合对修改关闭,对拓展开放的开闭原则,因此通过反射继续优化
public class JuiceFactory {
public Ijuice madeJuice(String className){
try{
if(StrUtils.isNotBlank(ClassName){
return (IJuice)Class.forName(className).newInstance();
}
}catch (Excption e) {
e.printStackTrace();
}
return null;
}
//客户端代码
public static void main(String[] args) {
JuiceFactory factory = new JuiceFactory();
IJuice juice = factory.madeJuice("com.pojo.AppleJuice");
juice.madeJuice();
}
7.到这一步,代码优化基本完成,此时新增新类型的果汁,则不需要修改工厂的代码。但是此时还存在不足点,入参为字符串,且工厂中还存在强制类型转换,故继续改造
public class JuiceFactory {
public Ijuice madeJuice(Clazz extends Ijuice> clazz){
try{
if(null != clazz){
return clazz.newInstance();
}
}catch (Excption e) {
e.printStackTrace();
}
return null;
}
//客户端代码
public static void main(String[] args) {
JuiceFactory factory = new JuiceFactory();
IJuice juice = factory.madeJuice(AppleJuice.class);
juice.madeJuice();
}
但是简单工厂模式也有缺点,如果不同业务有不同的处理,则会导致工厂类的职责过重,不易于拓展。
PART3 工厂方法模式1.工厂方法模式定义一个创建对象的接口,让实现该接口的类来决定实例化哪个类,工厂方法模式将实例化推进至子类中进行,根据单一职责原则对上述代码进行拆分,细化工厂,对工厂类进行抽象,如苹果汁由苹果汁工厂创建,香蕉汁由香蕉汁工厂创建
public interface IJuiceFactory {
IJuice madeJuice();
}
ing



