简单工厂模式

房东的猫 提交于 2020-02-26 18:15:14

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

我们举个简单的例子来说明:

上图是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 extends ConsumerDemo {

    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工厂的逻辑,有点违法了开闭原则。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!