简单工厂模式是工厂模式的一种最简单的形式,该模式可以根据消费者的需求,生产固定的几种产品,且将生产产品(创建对象的行为逻辑隐藏起来)。大概的类图如下:
可以看到,简单工厂将产品创建的过程交给工厂去处理,我们不需要关心如何创建,我们举个简单的例子来说明:
上图是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
工厂的逻辑,有点违法了开闭原则。