下班了,我们去食堂吃饭,食堂中有各色各样的菜色供大家选择,大家可以根据自己的口味选择不同的菜,而无论你选什么菜都是在这一个食堂被做出来的,这时候,“食堂”就是一个简单工厂。
UML图
从上图可以看出,工厂是具体的,Product是抽象的,里面的方法operation是virtual的,它的三个子类是具体的,子类中的operation覆盖父类的方法operation。
Factory能够根据客户的请求,生成不同的具体对象,这可以通过flag来标示。假定flag = 1时,生成ConcreteProduct1对象。
- 首先为所有产品定义一个共同的产品接口:
public interface Product {
abstract public void operation();
}
2.让生产的所有产品都必须实现上面的接口
class Washer implements Product{
public void operation() {
// TODO Auto-generated method stub
System.out.println("制造洗衣机");
}
}
class Fridge implements Product{
public void operation() {
// TODO Auto-generated method stub
System.out.println("制造冰箱");
}
}
class AirConditioner implements Product{
public void operation() {
// TODO Auto-generated method stub
System.out.println("制造空调");
}
}
3.写一个工厂类,用来负责生产以上的产品
public class SimpleFactory {
public static void createProduct(String productName) {
if("Washer".equals(productName)){
//生产洗衣机
Washer washer = new Washer();
washer.operation();
}else if ("Fridge".equals(productName)) {
//生产冰箱
Fridge fridge = new Fridge();
fridge.operation();
}else if ("AirConditioner".equals(productName)) {
//生产空调
AirConditioner airConditioner = new AirConditioner();
airConditioner.operation();
}
}
}
4.编写好工厂类之后就可以下单了
public static void main(String[] args) {
SimpleFactory.createProduct("AirConditioner");
SimpleFactory.createProduct("AirConditioner");
SimpleFactory.createProduct("Washer");
SimpleFactory.createProduct("Fridge");
SimpleFactory.createProduct("Washer");
SimpleFactory.createProduct("Fridge");
}
由上面的代码可以看出,简单工厂的核心就是一个SimpleFactory类,他拥有必要的逻辑判断能力和所有产品的创建权利,我们只需要向把定单给他,就能得到我们想要的产品。这使用起来似乎非常方便。
但,实际上,这个SimpleFactory有很多的局限。首先,我们每次想要增加一种新产品的时候,都必须修改SimpleFactory的原代码。其次,当我们拥有很多很多产品的时候,而且产品之间又存在复杂的层次关系的时候,这个类必须拥有复杂的逻辑判断能力,其代码量也将不断地激增,这对以后的维护简直就是恐怖两个字…
还有就是,整个系统都严重依赖SimpleFactory类,只要SimpleFactory类一出问题,系统就进入不能工作的状态,这也是最为致命的一点….
以上的不足将在工厂模式的另外两种状态中得到解决。