把书读薄 | 《设计模式之美》设计模式与范式(创建型-工厂模式)(下)

简介: 本文是 设计模式与范式:创建型(44-45),工厂模式(Factory Design Pattern) 也是用的比较多的创建型设计模式~ 二手知识加工难免有所纰漏,感兴趣有时间的可自行查阅原文,谢谢。

其中最关键的角色是 → 抽象产品,它的好坏直接决定了抽象工厂和具体功能能否发挥最大作用,应用此模式时应该朝着 分析共性规律 的方向走,仔细分析实现类该如何实现。

以上面说的茶和小吃为例写个抽象工厂模式的例子,先是产品类:


// 抽象产品类①
public abstract class Tea {
    protected abstract String createTea();
}
// 抽象产品类②
public abstract class Snack {
    public abstract String createSnack();
}
// 具体产品类(茶类沿用之前的,小吃类新增两个)
public class HandGrab extends Snack {
    @Override
    public String createSnack() { return "手抓饼"; }
}
public class FishBall extends Snack {
    @Override
    public String createSnack() { return "章鱼小丸子"; }
}


接着是抽象工厂和测试用例:


// 抽象工厂(套餐)
public abstract class SetMenuFactory {
    public abstract Tea createTeaMaker();
    public abstract factory.Snack createSnackMaker();
}
// 具体工厂①
public class ASetMenuFactory extends SetMenuFactory {
    @Override
    public Tea createTeaMaker() { return new TapiocaMilkTea(); }
    @Override
    public Snack createSnackMaker() { return new HandGrab(); }
}
// 具体工厂②
public class BSetMenuFactory extends SetMenuFactory {
    @Override
    public Tea createTeaMaker() { return new TapiocaMilkTea(); }
    @Override
    public Snack createSnackMaker() { return new FishBall(); }
}
// 测试用例
public class SuperTeaStoreTest {
    public static void main(String[] args) {
        SetMenuFactory factoryFirst = new ASetMenuFactory();
        System.out.println("产出一杯:" + factoryFirst.createTeaMaker().createTea() +
                "和一份:" + factoryFirst.createSnackMaker().createSnack());
        SetMenuFactory factorySecond = new BSetMenuFactory();
        System.out.println("产出一杯:" + factorySecond.createTeaMaker().createTea() +
                "和一份:" + factorySecond.createSnackMaker().createSnack());
    }
}


运行结果如下:


网络异常,图片无法展示
|


抽象工厂的优点:符合开闭原则和单一原则、将使用和创建的代码解耦,增加新的产品系列容易。抽象工厂的缺点:代码量和学习成本增加,变更产品结构困难,比如上面的套餐,要添加调味包的产品。


0x2、如何设计实现一个DI框架


在讲依赖反转原则(DIP)的时候就提过这几个名词,再粘贴下以便区分:


网络异常,图片无法展示
|


工厂模式与DI容器的关系


DI容器底层最基本的设计思路就是基于工厂模式的,相当于一个大工厂,负责在程序启动时,根据配置(创建哪些类对象、对象创建需要依赖哪些其他类对象) 事先创建好对象。当程序需要用到某个类对象时,直接从容器中获取即可。正是因为它持有一堆对象,所以这个框架才被称为 "容器"。


DI容器的三个核心功能:


  • 配置解析:通过一种形式让应用告知DI容器要创建哪些对象,一般通过配置文件形式,如Spring的配置文件;


  • 对象创建:DI容器根据配置文件提供的信息创建对象,Java中一般通过反射来动态加载类、创建对象;


  • 生命周期管理:返回新对象还是复用、是否延迟加载、是否配置对象初始化/销毁的钩子等;


课程中写了一个实现简单DI容器的例子,比较简单,只列下流程:最小原型设计提供执行入口配置文件解析核心工厂类设计


Android中常见的依赖注入框架有下面几类:


  • View注入:XUtils、Android Annotations、ButterKnife


  • 参数注入:ARouter


  • 对象注入:koin、Dagger2、Hilt


前两类严格意义上不能算真正的注入,本文内容感觉有些单薄,后面会挑一个DI框架的源码进行分析巩固


相关文章
|
11天前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
14 5
|
2月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
34 2
|
2月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
8天前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
14天前
|
设计模式 Oracle Java
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。
【6月更文挑战第20天】工厂模式简化对象创建,根据参数或条件生成MySQL或Oracle数据库连接。`DatabaseConnectionFactory`作为工厂,动态返回具体连接类型。装饰器模式则用于运行时动态增加对象功能,如`LoggingDecorator`为`Runnable`对象添加日志记录,保持代码整洁。在`Main`类中展示了如何使用这两种模式。
26 6
|
26天前
|
设计模式 XML Java
【设计模式】第三篇:一篇搞定工厂模式【简单工厂、工厂方法模式、抽象工厂模式】
三 结尾 如果文章中有什么不足,欢迎大家留言交流,感谢朋友们的支持! 如果能帮到你的话,那就来关注我吧!如果您更喜欢微信文章的阅读方式,可以关注我的公众号
23 5
|
7天前
|
设计模式 Java 数据库连接
【Java设计模式 - 创建型模式2】工厂模式
【Java设计模式 - 创建型模式2】工厂模式
7 0
|
14天前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式
|
2月前
|
设计模式 安全 Java
【设计模式学习】单例模式和工厂模式
【设计模式学习】单例模式和工厂模式
|
2月前
|
设计模式 Java
Java 设计模式:工厂模式与抽象工厂模式的解析与应用
【4月更文挑战第27天】设计模式是软件开发中用于解决常见问题的典型解决方案。在 Java 中,工厂模式和抽象工厂模式是创建型模式中非常核心的模式,它们主要用于对象的创建,有助于增加程序的灵活性和扩展性。本博客将详细介绍这两种模式的概念、区别以及如何在实际项目中应用这些模式。
23 1