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

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

0x1、定义


一般将工厂模式细分为种:简单工厂工厂方法抽象工厂,前两个在项目中用得多一些。


适用场景:创建一个对象,但创建过程比较复杂,希望对外隐藏这些细节


注意!适用于对象创建过程比较复杂的场景,一般是这两类:创建过程涉及复杂的if-else分支判断复杂依赖 (如new A(new B(new C()))),应用工厂模式无疑会带来类文件的增加,简单的场景直接new构造不香吗?


接下来通过一个简单的奶茶店案例来引入这几种模式的使用,先是面向过程(OOP)的写法:


public class TeaStoreTest {
    public static String make(int type) {
        String teaName = null;
        if (type == 0) {
            teaName = "珍珠奶茶";
        } else if (type == 1) {
            teaName = "港式奶茶";
        } else if (type == 2) {
            teaName = "冰奶茶";
        } else if (type == 3) {
            teaName = "冻柠茶";
        }
        return teaName;
    }
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            String teaName = make(new Random().nextInt(5));
            if (teaName != null) {
                System.out.println("产出一杯:" + teaName);
            } else {
                System.out.println("本店暂无此款茶饮~");
            }
        }
    }
}


运行结果如下:


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


把奶茶名生成的步骤包裹在make()方法中,传入不同的type,返回不同的奶茶名。接着转换下思路,OOP面向对象思想,可以将这部分逻辑剥离到一个独立的类中,让这个类只负责 奶茶名的创建


// 生产奶茶的类
public class OldTeaStore {
    public String make(int type) {
        String teaName = null;
        if (type == 0) {
            teaName = "珍珠奶茶";
        } else if (type == 1) {
            teaName = "港式奶茶";
        } else if (type == 2) {
            teaName = "冰奶茶";
        } else if (type == 3) {
            teaName = "冻柠茶";
        }
        return teaName;
    }
}
// 测试用例
public class OldTeaStoreTest {
    public static void main(String[] args) {
        OldTeaStore store = new OldTeaStore();
        for (int i = 0; i < 5; i++) {
            String teaName = store.make(new Random().nextInt(5));
            if (teaName != null) {
                System.out.println("产出一杯:" + teaName);
            } else {
                System.out.println("本店暂无此款茶饮~");
            }
        }
    }
}


① 简单工厂 (Simple Factory)


不变的只有变化本身,而需求是不断变化的,现在单单一个奶茶名可不够,可能还要奶茶容量、价格等,基于封装和抽象的思想,我们抽象出一个Tea类,包含一个createTea() 生产奶茶的方法,并实现四个具体的茶类。


// 抽象的茶
public abstract class Tea {
    protected abstract String createTea();
}
// 具体的茶
public class TapiocaMilkTea extends Tea {
    @Override
    protected String createTea() { return "珍珠奶茶"; }
}
public class HKStyleHotTea extends Tea {
    @Override
    protected String createTea() { return "港式奶茶"; }
}
public class IcedMilkTea extends Tea {
    @Override
    protected String createTea() { return "冰奶茶"; }
}
public class IcedLemonTea extends Tea {
    @Override
    protected String createTea() { return "冻柠茶"; }
}


接着是生产奶茶的类:


// 创建Tea实例的类
public class NewTeaStore {
    public String exchange(int type) {
        String teaName = "";
        if (type == 0) {
            teaName = "珍珠奶茶";
        } else if (type == 1) {
            teaName = "港式奶茶";
        } else if (type == 2) {
            teaName = "冰奶茶";
        } else if (type == 3) {
            teaName = "冻柠茶";
        }
        return teaName;
    }
    public Tea make(int type) {
        String teaName = exchange(type);
        Tea tea = null;
        if (teaName.equals("珍珠奶茶")) {
            tea = new TapiocaMilkTea();
        } else if (teaName.equals("港式奶茶")) {
            tea = new HKStyleHotTea();
        } else if (teaName.equals("冰奶茶")) {
            tea = new IcedMilkTea();
        } else if (teaName.equals("冻柠茶")) {
            tea = new IcedLemonTea();
        }
        return tea;
    }
}
// 测试用例
public class NewTeaStoreTest {
    public static void main(String[] args) {
        NewTeaStore store = new NewTeaStore();
        for (int i = 0; i < 5; i++) {
            Tea tea = store.make(new Random().nextInt(5));
            if (tea != null) {
                System.out.println("产出一杯:" + tea.createTea());
            } else {
                System.out.println("本店暂无此款茶饮~ ");
            }
        }
    }
}


相关文章
|
3月前
|
设计模式
**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合
【6月更文挑战第23天】**工厂模式与抽象工厂模式**都是创建型设计模式,用于封装对象创建,减少耦合。工厂模式专注于单个对象,通过具体工厂创建具体产品,适用于简单对象创建;抽象工厂则关注一系列相关产品,提供创建一族对象的接口,适用于处理多个不兼容产品族。选择模式基于问题域的复杂性,单个产品需求时用工厂模式,多产品族时用抽象工厂模式。
29 5
|
4月前
|
设计模式 Java
Java一分钟之-设计模式:工厂模式与抽象工厂模式
【5月更文挑战第17天】本文探讨了软件工程中的两种创建型设计模式——工厂模式和抽象工厂模式。工厂模式提供了一个创建对象的接口,延迟实例化到子类决定。过度使用或违反单一职责原则可能导致问题。代码示例展示了如何创建形状的工厂。抽象工厂模式则用于创建一系列相关对象,而不指定具体类,但添加新产品可能需修改现有工厂。代码示例展示了创建颜色和形状的工厂。根据需求选择模式,注意灵活性和耦合度。理解并恰当运用这些模式能提升代码质量。
52 2
|
20天前
|
设计模式 Java
Java 设计模式之谜:工厂模式与抽象工厂模式究竟隐藏着怎样的神奇力量?
【8月更文挑战第30天】在Java编程中,设计模式为常见问题提供了高效解决方案。工厂模式与抽象工厂模式是常用的对象创建型设计模式,能显著提升代码的灵活性、可维护性和可扩展性。工厂模式通过定义创建对象的接口让子类决定实例化哪个类;而抽象工厂模式则进一步提供了一个创建一系列相关或相互依赖对象的接口,无需指定具体类。这种方式使得系统更易于扩展和维护。
30 1
|
24天前
|
设计模式 算法 开发者
深入理解工厂模式与策略模式:设计模式的灵活应用
深入理解工厂模式与策略模式:设计模式的灵活应用
|
4月前
|
设计模式 搜索推荐 数据库连接
第二篇 创建型设计模式 - 灵活、解耦的创建机制
第二篇 创建型设计模式 - 灵活、解耦的创建机制
|
1月前
|
设计模式 uml C语言
设计模式----------工厂模式之简单工厂模式(创建型)
这篇文章详细介绍了简单工厂模式,包括其定义、应用场景、UML类图、通用代码实现、运行结果、实际应用例子,以及如何通过反射机制实现对象创建,从而提高代码的扩展性和维护性。
设计模式----------工厂模式之简单工厂模式(创建型)
|
1月前
|
设计模式 uml
设计模式-------------工厂模式之工厂方法模式(创建型)
工厂方法模式是一种创建型设计模式,它通过定义一个用于创建对象的接口,让子类决定实例化哪一个类,从而实现类的实例化推迟到子类中进行,提高了系统的灵活性和可扩展性。
|
1月前
|
设计模式 Java C语言
设计模式-----------工厂模式之抽象工厂模式(创建型)
抽象工厂模式是一种创建型设计模式,它提供了一个接口用于创建一系列相关或相互依赖的对象,而无需指定具体类,从而增强了程序的可扩展性并确保客户端只使用同一产品族的产品。
设计模式-----------工厂模式之抽象工厂模式(创建型)
|
2月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
34 3
|
2月前
|
设计模式 安全 Java
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
60 1