简单工厂模式是工厂模式的一种最简单的形式,该模式可以根据消费者的需求,生产固定的几种产品,且将生产产品(创建对象的行为逻辑隐藏起来)
我们举个简单的例子来说明:
上图是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
工厂的逻辑,有点违法了开闭原则。
来源:oschina
链接:https://my.oschina.net/mingshashan/blog/3175446