【Java 设计模式】简单工厂模式 & 静态工厂模式

§1 简单工厂模式

  • 简单工厂模式并不属于 23 种设计模式。

§1.1 角色

  • 抽象产品:定义产品的规范,描述产品的主要特性和功能,如:咖啡。
  • 具体产品:实现或继承抽象产品的子类,如:美式咖啡,拿铁咖啡。
  • 具体工厂:提供创建产品的方式,供产品使用者调用获取具体产品,如:咖啡工厂生产咖啡,咖啡店通过咖啡工厂获取咖啡。

§1.2 点咖啡案例

  • 简单工厂模式其实就是将产品的创建工作交由工厂进行,而不是让产品使用者自己去创建。
  • 以点咖啡为例,咖啡店(产品使用者)不用直接去 new 咖啡(具体产品),而是通过调用咖啡工厂(具体工厂)提供的方法来获取咖啡。

§1.2.1 类图

在这里插入图片描述

§1.2.2 实现

// 抽象产品: 咖啡类
public abstract class Coffee {
    public abstract String getName();
    public void addMilk() {
        System.out.println("咖啡加奶");
    }
    public void addSugar() {
        System.out.println("咖啡加糖");
    }
}

// 具体产品: 美式咖啡类
public class AmericanCoffee extends Coffee{
    @Override
    public String getName() {
        return "美式咖啡";
    }
}

// 具体产品: 拿铁咖啡类
public class LatteCoffee extends Coffee{
    @Override
    public String getName() {
        return "拿铁咖啡";
    }
}

// 具体工厂: 咖啡工厂类
public class SimpleCoffeeFactory {
    public Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("AmericanCoffee".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("LatteCoffee".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("该产品暂未提供");
        }
        return coffee;
    }
}

// 咖啡店类
public class CoffeeStore {
    public Coffee orderCoffee(String type) {
        SimpleCoffeeFactory factory = new SimpleCoffeeFactory();
        Coffee coffee = factory.createCoffee(type);
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

// 测试类
public class Test {
    public static void main(String[] args) {
        // 1.创建一个咖啡类
        CoffeeStore coffeeStore = new CoffeeStore();
        // 2.点咖啡
        Coffee coffee = coffeeStore.orderCoffee("AmericanCoffee");
        System.out.println(coffee.getName());
    }
}
/* 测试结果:
咖啡加奶
咖啡加糖
美式咖啡
*/

§1.3 优点

  • 与对象解耦。封装了创建对象的过程,将对象的创建与业务逻辑分离开,避免修改客户的代码。如果出现了新的咖啡品种,直接修改咖啡工厂类即可,省去对咖啡店代码的修改。
  • 此时会有人疑问,既然都需要修改代码,为啥不直接修改咖啡店(产品使用者,客户)的代码呢?这是因为可能有很多咖啡店,难道每一个都要去修改一遍吗?这样是不是太麻烦了呢!

§1.4 缺点

  • 虽然咖啡店(客户)代码无需修改,但是需要修改咖啡工厂(具体工厂)的代码,这样同样违反了设计原则中的开闭原则

§2 静态工厂模式

  • 静态工厂模式也不属于 23 种设计模式。
  • 静态工厂模式可以说是简单工厂模式的扩展,只是将咖啡工厂(具体工厂)中创建咖啡(具体产品)的方法定义为静态方法而已。

§2.1 代码变动

// 具体工厂: 咖啡工厂类
public class SimpleCoffeeFactory {
    public static Coffee createCoffee(String type) {
        Coffee coffee = null;
        if ("AmericanCoffee".equals(type)) {
            coffee = new AmericanCoffee();
        } else if ("LatteCoffee".equals(type)) {
            coffee = new LatteCoffee();
        } else {
            throw new RuntimeException("该产品暂未提供");
        }
        return coffee;
    }
}


// 咖啡店类
public class CoffeeStore {
    public Coffee orderCoffee(String type) {
        Coffee coffee = SimpleCoffeeFactory.createCoffee(type);
        coffee.addMilk();
        coffee.addSugar();
        return coffee;
    }
}

§2.2 优点

  • 咖啡店(客户)在获取咖啡(具体产品)时,不需要创建咖啡工厂(具体工厂)对象,可以直接通过类名.方法名的方式来获取,避免创建多个工厂对象导致的资源浪费。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
简单工厂模式是一种常见的创建型设计模式,它通过一个工厂类来创建不同类型的对象。在简单工厂模式中,客户端无需关心具体的对象创建过程,只需通过工厂类的静态方法来获取所需的对象实例。这样可以降低代码的耦合度,也方便了对象的创建和管理。 工厂方法模式是一种将对象的创建延迟到子类的设计模式。在工厂方法模式中,将对象的创建放在具体的工厂子类中,每个具体工厂子类负责创建一种类型的对象。客户端只需要和抽象工厂接口进行交互,具体的对象创建过程由具体子类来完成。这样可以提供一种扩展性更好的解决方案,对于新增产品类的扩展,只需要新增相应的具体工厂子类即可。 抽象工厂模式是一种提供一种创建一系列相关或依赖对象的接口,而无需指定具体类的设计模式。在抽象工厂模式中,通过定义抽象工厂接口和具体工厂类来创建一系列相关或依赖的对象。每个具体工厂类负责创建一组具体的对象,通过抽象工厂接口对外提供创建对象的方法。这样可以将具体对象的创建逻辑从客户端代码中分离出来,提高了系统的灵活性和可扩展性。 在Java中,你可以通过定义一个包含多个静态方法的工厂类来实现简单工厂模式。每个静态方法对应一个具体的产品对象的创建逻辑。工厂方法模式可以通过定义一个抽象工厂接口和多个具体工厂类来实现。每个具体工厂类负责创建一种产品对象。抽象工厂模式可以通过定义一个抽象工厂接口和多个具体工厂类来实现。每个具体工厂类负责创建一组相关的产品对象。客户端通过访问抽象工厂接口来创建对象,具体的对象创建过程由具体工厂类来完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

准Java全栈开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值