一、简单工厂介绍
在现实生活中工厂是负责生产产品的,在设计模式中简单工厂也可以理解为负责生产对象的一个类,
简单工厂实现思路:封装改变,找到改变的代码然后把改变的代码用类封装起来。
二、案例列举
在外面打工的人,免不了要经常在外面吃饭,当然我们也可以自己在家
做饭吃,但是自己做饭吃麻烦,因为又要自己买菜,然而,出去吃饭就
完全没有这些麻烦的,我们只需要到餐馆点菜就可以了,买菜的事情就
交给餐馆做就可以了,这里餐馆就充当简单工厂的角色,下面让我们看
看现实生活中的例子用代码是怎样来表现的。
代码编写:
/**
* 顾客充当客户端,负责调用简单工厂来生产对象即客户点菜,
* 厨师(相当于简单工厂)负责烧菜(生产的对象)
*/
public class Customer {
public static void main(String[] args) {
// 客户想点一个西红柿炒蛋
Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
food1.Print();
// 客户想点一个土豆肉丝
Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
food2.Print();
}
}
/**
* 菜抽象类
*/
public abstract class Food {
// 输出点了什么菜
public abstract void Print();
}
/**
* 简单工厂类, 负责 炒菜.
*/
public class FoodSimpleFactory {
public static Food CreateFood(String type) {
Food food = null;
if (type.equals("土豆肉丝")) {
food = new ShreddedPorkWithPotatoes();
} else if (type.equals("西红柿炒蛋")) {
food = new TomatoScrambledEggs();
}
return food;
}
}
/**
* 土豆肉丝这道菜
*/
public class ShreddedPorkWithPotatoes extends Food {
@Override
public void Print() {
System.out.println("一份土豆肉丝");
}
}
/**
* 西红柿炒鸡蛋这道菜
*/
public class TomatoScrambledEggs extends Food{
@Override
public void Print() {
System.out.println("一份西红柿炒蛋!");
}
}
自己做饭,如果我们想吃别的菜时,此时就需要去买这种菜和洗菜这些繁琐的
操作,有了餐馆(也就是简单工厂)之后,我们就可以把这些操作交给餐馆去
做,此时消费者(也就是我们)对菜(也就是具体对象)的依赖关系从直接变
成的间接的,这样就是实现了面向对象的另一个原则——降低对象之间的耦合
度,下面就具体看看有了餐馆之后的实现代码(即简单工厂的实现)
UML图:
三、缺点和应用场景
缺点:
1,工厂类集中了所有产品创建逻辑,一旦不能工作,整个系统都会受
到影响。
2,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这就造成
工厂逻辑负责。
应用场景:
1,当工厂类负责创建对象比较少时,可以考虑使用简单工厂。
2,客户如果只知道传入工厂参数,对应如何创建逻辑不关心,可以考
虑使用简单工厂。