学了也学不懂的spring笔记(2)|三种工厂模式

学了也学不懂的spring笔记(2)|三种工厂模式,第1张

学了也学不懂的spring笔记(2)|三种工厂模式

《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 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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5082143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存