工厂模式

设计模式

最近买了本设计模式的书Header First 非常喜欢其中的讲解方式。虽然买了有一段时间了但是没有认真的看过。这段时间工作相对没有那么难了,所以抽出点时间看一下这本书,同时,在这里做一下分享,希望可以帮到你!

1、定义

工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类。

所有工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

2、使用场景

假如我有一个披萨店,刚开始没有分店也只是提供了北京口味的pizza。所以我的创建很简单。

我的pizza

但是后来用户给我反馈,因为他们来自不同的地区所以希望我提供,北京口味、东北口味的披萨。

OK 那么我在点单的时候让用户自主的去选择order(type);
那么我的点单的方法改成了这样

1
2
3
4
5
6
7
8
9
10
- (void)order:(NSInteger)aType
{
Pizza *pizza = nil;
if (type == @"东北") {
pizza = DBPizza();
} else if (type == @"北京"){
pizza = BJPizza();
}
}

后来生意更好了,全国开了很多分店,就会不断的加入更多的其他口味的pizza,同时也有可能有很多pizza的口味因为不符合要求被下架。所以这可能导致我的点餐方法越来越复杂。

同时,因为全国都有分店,分店中可能很多同一口味的做法都不同,所以这时候要考虑把这个全国都使用的方法下方到地方,不再做统一的管理。

首先想到的肯定是把这个方法抽出来,单独放到一个类中。这个类实际上就是一个工厂类。我们将要点餐的type传入之后由这个工厂类决定到底实例化哪一种pizza。

3、思考

1、这么做的好处是什么?还是只是做了简单的代码的分离。

我们这里,在这个工厂类中只是提供了这一个方法,之后我们可能还会有其他的工厂方法,都可以放到这个类中,所以这个工厂方法为代码以后的扩展提供了方便,同时如果以后需要修改或者添加可以直接修改这个类就可以了。

2、对于pizza的工厂方法,我们可能有很多的类型比如BJPizzaFactory,DBPizzaFactory 如果有很多的这种工厂方法,我们如何做统一的管理呢?

我们可以设置一个基类,这个基类用来控制Pizza的整个制作流程,同时提供一个抽象方法createPizza,我们让BJPizzaFactory,DBPizzaFactory继承自这个类,同时实现createPizza这个抽象方法。

4、修改思路

1、客户点单
PizzaStore bjPizzaStore = new BJPizzaStore();
bjPizzaStore.orderPizza(“cheese”);

2、制作pizza
Pizza pizza = createPizza(“cheese”);

3、其他流程
pizza.bake();
pizza.cut();
pizza.box();

5、具体实现

流程

结果

代码实现在这里