一起走进工厂方法模式

一.简单工厂思想

在学习工厂方法模式前,先来了解一下简单工厂,对于产品种类相对较少、后续扩展概率比较低的情况,可以考虑使用简单工厂模式

class SimpleFactory { 
    //根据type创建不同的产品
    public static Product createProduct(int type) {
        if (type == 0) {
           return new ProductA();
        } else if (type == 1) {
           return new ProductB();
        } else{
            throw new IllegalArgumentException();
        }
    }
}

简单工厂的缺点

  • 违背了开闭原则
  • 扩展性不高(新增产品要去改动createProduct方法)
  • 工厂与具体产品的耦合度太高
二.介绍

工厂方法模式(Factory Pattern)属于创建型模式,含义是在工厂方法中有一个方法负责去返回产品对象。工厂方法模式的本质是将接口/抽象类的实例化过程推迟到了子类。软件中易变的细节可以从派生的实现类来进行扩展,当软件需要发生变化时,只需要根据需求重新派生一个实现类

三.UML类图

在这里插入图片描述

四.具体代码
public class Shop {
    private Creator creator;

    public void setCreator(Creator creator) {
        this.creator = creator;
    }

    public void offerProduct(){
        System.out.println(creator.createProduct().getName());
    }

    public static void main(String[] args) {
        Shop shop = new Shop();
        shop.setCreator(new ConcreteCreatorA());
        shop.offerProduct();
    }
}

//抽象产品
interface Product {
    String getName();
}

//具体产品
class ProductA implements Product {
    @Override
    public String getName() {
        return "productA";
    }
}

//具体产品
class ProductB implements Product {
    @Override
    public String getName() {
        return "productB";
    }
}

//抽象工厂
abstract class Creator {
    public abstract Product createProduct();
}

//具体工厂
class ConcreteCreatorA extends Creator {

    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

//具体工厂
class ConcreteCreatorB extends Creator {

    @Override
    public Product createProduct() {
        return new ProductB();
    }
}
五.优缺点
  • 优点
    • 将调用者与具体产品解耦(Shop与ProductA、ProductB)
    • 符合开闭原则
    • 符合单一职责原则(明确分割使用对象与管理对象的职责)
  • 缺点
    • 每增加一个产品就要增加一个对应的工厂类,可能会造成类爆炸
六.在JDK中的应用
  1. 简单工厂:java.text.NumberFormat#getInstance()
    在这里插入图片描述

  2. 工厂方法:java.util.Collection#iterator
    在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值