简单工厂模式

简单工厂模式是工厂模式的一种最简单的形式,该模式可以根据消费者的需求,生产固定的几种产品,且将生产产品(创建对象的行为逻辑隐藏起来)。大概的类图如下:

image-20220222212905008

可以看到,简单工厂将产品创建的过程交给工厂去处理,我们不需要关心如何创建,我们举个简单的例子来说明:

img

上图是IDEA导出来的图片,我们有一个Phone的抽象接口

然后有很多具体的实现类,比如:Honor

有一个Phone的工厂类PhoneFactory,当用户想要手机的时候,调用工厂类的ProducePhone方法,可以根据手机品牌名称生产对应的手机。

接下来我们看代码:

Phone接口:

public interface Phone {

    String getName();
}

荣耀手机:

public class Honor implements Phone{

    @Override
    public String getName() {
        return "荣耀";
    }
}

华为手机:

public class HuaWei implements Phone {
    @Override
    public String getName() {
        return "华为";
    }
}

小米手机:

public class Mi implements Phone {
    @Override
    public String getName() {
        return "小米";
    }
}

Oppo手机:

public class Oppo implements Phone {
    @Override
    public String getName() {
        return "Oppo";
    }
}

生产手机的工厂:

public class PhoneFactory{

    public Phone producePhone(String name) {
        Phone phone;
        switch (name) {
            case "华为":
                phone = new HuaWei();
                break;
            case "荣耀":
                phone = new Honor();
                break;
            case "小米":
                phone = new Mi();
                break;
            case "Oppo":
                phone = new Oppo();
                break;
            // 防止出现异常
            default:
                throw new RuntimeException("不能生产[" + name + "],这样的手机");
        }

        return phone;
    }
}

我们的消费者(测试类):

public class ConsumerDemo {

    public static void main(String[] args) {

        PhoneFactory phoneFactory = new PhoneFactory();

        // 生产华为手机
        Phone phone = phoneFactory.producePhone("华为");
        System.out.println(phone.getName());

        // 生产Oppo手机
        Phone oppo = phoneFactory.producePhone("Oppo");
        System.out.println(oppo.getName());

        // 生产一个不存在的手机,检测一下输入一个不存在的品牌,看看是否能生产出来
        Phone bodao = phoneFactory.producePhone("波导");
        System.out.println(bodao.getName());
    }
}

我们运行程序看到结果如下:

华为
Oppo
Exception in thread "main" java.lang.RuntimeException: 不能生产[波导],这样的手机
  at pattern.simplefactory.PhoneFactory.producePhone(PhoneFactory.java:26)
  at pattern.simplefactory.ConsumerDemo.main(ConsumerDemo.java:23)

到此我们看到简单工厂模式是不是特别简单,当然也有一些确定,我们可以总结一下优缺点:

优点:

  • 隐藏了创建对象的内部逻辑,给用户暴露出一个接口,可以让用户很方便的去创建对象,如果新增品牌的话,通过简单的改动就能够实现。

缺点:

  • 对象实例化的逻辑全部都在一个工厂类中,如果新增一个品牌则需要修改PhoneFactory工厂的逻辑,有点违法了开闭原则。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值