简单工厂模式带实战(不属于GOF的23种经典设计模式)

1、描述

简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

2、适用性

工厂类负责创建的对象(类型)比较少;客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

优点:

  • 工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类创建对象;

  • 客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量;

  • 通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

缺点:

  • 不易拓展,一旦添加新的产品类型,就不得不修改工厂的创建逻辑;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
  • 产品类型较多时,工厂的创建逻辑可能过于复杂,一旦出错可能造成所有产品的创建失败,不利于系统的维护。

3、实现逻辑

  • 抽象产品类 :简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。定义产品的规范,描述了产品的主要特性和功能。
  • 具体产品类 :实现或者继承抽象产品的子类;是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。
  • 工厂类:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

4、实战代码

通过从饮品店生成茶和咖啡为例;

/**
 * 抽象产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:24:11
 */
public abstract class Drinks {
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:29:14
 */
public class Tea extends Drinks {

    public Tea() {
        System.out.println("Tea");
    }
}

/**
 * 具体产品类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:26:36
 */
public class Coffee extends Drinks {

    public Coffee() {
        System.out.println("Coffee");
    }
}

/**
 * 工厂类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:19:53
 */
public class SimpleDrinksFactory {

    public Drinks createDrinks(String type) {
        if (type == null || type.length() == 0) {
            throw new RuntimeException("type cannot be empty");
        }
        switch (type) {
            case "Tea":
                return new Tea();
            case "Coffee":
                return new Coffee();
            default:
                throw new RuntimeException("The type was not found");
        }
    }
}

/**
 * 测试类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:41:14
 */
public class Client {

    public static void main(String[] args) {
        SimpleDrinksFactory factory = new SimpleDrinksFactory();
        Drinks tea = factory.createDrinks("Tea");
        Drinks coffee = factory.createDrinks("Coffee");
        Drinks drinks = factory.createDrinks(null);
    }
}

执行结果:

这样我们可以将繁琐创建对象的逻辑根据实际需求封装到工厂中(我们这里直接是通过无参构造 new 出来的,实际生产开发中的对象基本会需要逻辑操作),然后直接传入传入工厂类的参数就可以获取我们所需要的对象。

5、静态工厂

在生产开发中也可以将工厂类中的创建对象的功能定义为静态的,这个就是静态工厂模式,它也不是23种设计模式中的。

/**
 * 静态工厂类
 *
 * @author Eajur.Wen
 * @version 1.0
 * @date 2022-11-05 18:19:53
 */
public class StaticDrinksFactory {

    public static Drinks createDrinks(String type) {
        if (type == null || type.length() == 0) {
            throw new RuntimeException("type cannot be empty");
        }
        switch (type) {
            case "Tea":
                return new Tea();
            case "Coffee":
                return new Coffee();
            default:
                throw new RuntimeException("The type was not found");
        }
    }
}

原文地址:http://www.cnblogs.com/eajur/p/16860866.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性