《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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)