前言
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂
我们可以设想这样一个场景,手机生产厂家和用户,用户并不需要知道手机厂家生产手机产品的具体过程,用户只需要告诉厂家需要什么手机产品,生产过程由厂家负责。
我们先定义手机产品的接口:
Phone.java
public interface Phone {
void show(); // 输出手机的信息
}
接下来定义iPhone手机和WindowsPhone手机的具体产品
iPhone.java
public class iPhone implements Phone {
String brand; // 品牌
String os; // 操作系统
int storage; // 容量
public iPhone() {
this.brand = "Apple";
this.storage = 64;
this.os = "iOS";
}
@Override
public void show() {
System.out.println("品牌为:" + brand + ",操作系统为:" + os + ",容量为:" + storage + "GB");
}
}
WindowsPhone.java
public class WindowsPhone implements Phone {
String brand; // 品牌
String os; // 操作系统
int storage; // 容量
public WindowsPhone() {
this.brand = "WindowsPhone";
this.storage = 32;
this.os = "windows";
}
@Override
public void show() {
System.out.println("品牌为:" + brand + ",操作系统为:" + os + ",容量为:" + storage + "GB");
}
}
最后定义生产厂家:
Factory.java
public class Factory {
// 用户只需告诉厂家需要什么手机,厂家就会执行具体的创建过程
public static Phone produce(String name) {
if ("WP".equals(name)) {
return new WindowsPhone();
} else if ("iPhone".equals(name)) {
return new iPhone();
} else {
return null;
}
}
}
最后看看客户端调用代码:
Main.java
public class Main {
public static void main(String[] args) {
Phone phone = Factory.produce("iPhone"); // 生产iPhone手机
phone.show(); // 输出手机产品信息
phone = Factory.produce("WP"); // 生产WindowsPhone手机
phone.show(); // 输出手机产品信息
}
}
用户需要什么手机,直接告诉厂家即可。这里是通过字符串传值,由写错单词的风险,可以改进成使用枚举类型的参数,这里直接给出优化后的代码:
Factory.java
// 改进后的工厂类
public class Factory {
enum type {iPhone, WindowsPhone}
public static Phone produce(type name) {
if (type.WindowsPhone.equals(name)) {
return new WindowsPhone();
} else if (type.iPhone.equals(name)) {
return new iPhone();
} else {
return null;
}
}
}
Main.java
// 改进后的客户端调用代码
public class Main {
public static void main(String[] args) {
Phone phone = Factory.produce(Factory.type.iPhone);
phone.show();
phone = Factory.produce(Factory.type.WindowsPhone);
phone.show();
}
}
总结
简单工厂可以使调用方创建具体实例的过程,将具体创建过程交给工厂类来完成。但是简单工厂模式的缺点很明显,就是没有满足开闭原则,每当新增一个产品,都需要修改工厂类的代码,往if-else
语句中增加新的分支来创建新的实例,这就是所谓的对修改开放了。那么如何消除这些缺点?请看简单工厂的进阶——工厂模式。