工厂模式的引入
我们幻想一个情况:我们现在是一个食堂,食堂要卖饭,顾客先定饭,我们去做,然后去卖。这似乎并不难写:
class OrderFood{
Food food =null;
String foodType;
public OrderFood() {
foodType = orderFood();
if(foodType.equals("面条")) {
food = new Noodles();
}
else if(foodType.equals("粥")) {
food = new Rice();
}
else if(foodType.equals("米饭")) {
food = new Porridge();
}
food.prepareFood();
food.sellFood();
}
String orderFood(){
String foodType;
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
foodType = scanner.next();
return foodType;
}
}
abstract class Food{
void sellFood() {
System.out.println("食物已经卖出");
}
abstract void prepareFood();
}
class Noodles extends Food{
void prepareFood() {
System.out.println("面条准备中....");
}
}
class Rice extends Food{
void prepareFood() {
System.out.println("米饭准备中....");
}
}
class Porridge extends Food{
void prepareFood() {
System.out.println("粥准备中....");
}
}
但是这个代码它并不符合我们的七大设计原则,我们的原则中包括:对内修改关闭,对外扩展开放。然而我们现在如果有了一个新的食物比如馒头,我们就需要对这个类的构造函数进行修改。而像这样需要修改的地方往往会越来越多,代码的修改维护成本过高。我们把创建 Food 对象封装到一个类中,这样我们有新的Food种类时,只需要修改该类就可,其它有创建到 Food对象的代码就不需要修改了.-> 简单工厂模式。
简单工厂模式
简单工厂模式是属于创建型模式,是工厂模式的一种。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。 在软件开发中,当我们会用到大量的创建某种、某类或者某批对象时,就会使用到工厂模式。
public class CompanyModel {
public static void main(String[] args) {
OrderFood o =new OrderFood();
}
}
class OrderFood{
Food food =null;
String foodType;
public OrderFood() {
foodType = orderFood();
SimpleCompany simplecompany = new SimpleCompany();
food = simplecompany.createFood(foodType);
food.prepareFood();
food.sellFood();
}
String orderFood(){
String foodType;
@SuppressWarnings("resource")
Scanner scanner = new Scanner(System.in);
foodType = scanner.next();
return foodType;
}
}
abstract class Food{
void sellFood() {
System.out.println("食物已经卖出");
}
abstract void prepareFood();
}
class Noodles extends Food{
void prepareFood() {
System.out.println("面条准备中....");
}
}
class Rice extends Food{
void prepareFood() {
System.out.println("米饭准备中....");
}
}
class Porridge extends Food{
void prepareFood() {
System.out.println("粥准备中....");
}
}
class SimpleCompany{
public Food createFood(String orderType) {
Food food = null;
System.out.println("使用简单工厂模式");
if (orderType.equals("面条")) {
food = new Noodles();
}
else if (orderType.equals("粥")) {
food = new Porridge();
}
else if (orderType.equals("米饭")) {
food = new Rice();
}
return food;
}
}
这样我们相当于写了一个代码去完成类的创建,我们仅仅需要在这里加入新的食物类型比如馒头,至于食物和制作过程则不需要考虑。
工厂模式
但是我们既然已经说到工厂模式了,那就不得不得说一下,我们日常生活中,所见到的工厂往往是每一个工厂去生产零件随后去把他们放到一起的,所以我们再来思考食堂的问题,我们来思考,我们的面条有两个种类,拌面,汤面;粥有皮蛋瘦肉粥和南瓜小米粥;米饭有炒米和蒸米。我们使用简单的工厂模式自然是可以完成的,但是我们是不是可以采用一个更好的方式,我们可以创建一个大工厂(食堂),去来对这些食物进行分类到米饭,面条,粥,然后再进行小工厂(窗口)来对每一个类进行细分到拌面汤面等等。