前言:
来源于《head first 设计模式》。当作读书笔记了,这次看的是第四章装工厂模式。其实这一章前几天就看完了,拖延癌晚期,没整理,今天就来填一下坑吧。
抽象工厂模式的概念
提供一个接口用于创建相关或者依赖对象的家族,并不需要明确指定具体类
工厂方法模式的概念
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
注意:上述所写的接口并不是java中的接口,可以是抽象类也可以是java中的接口噢,大家别误解了。
在正式进入上述两个模式学习之前,我们先来了解一下简单工厂。
简单工厂不是一个设计模式,仅仅是一种变成习惯而已,那么什么是简单工厂模式呢?来看例子:
假设你有一个披萨店,那么一开始你可能会这样子写:
public class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza=new Pizza();
if(type.equals("cheeese")){
pizza=new CheesePizza();
}else if(type.equals("greek")){
pizza=new GreekPizza();
}
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
但是如果我们需要更多的类型的披萨呢??我们就需要修改该代码不断的加入if else语句了。 此时的我们可以发现代码后期会修改的部分就是披萨的类型,这时候该是时候使用封装了
- 定义一个简单的工厂
public class SimplePizzaFactory {
public Pizza createPizza(String type) {
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
} else if (type.equals("pepperoni")) {
pizza = new PepperoniPizza();
} else if (type.equals("clam")) {
pizza = new ClamPizza();
} else if (type.equals("veggie")) {
pizza = new VeggiePizza();
}
return pizza;
}
}
- 修改披萨店的代码
public class PizzaStore {
SimplePizzaFactory factory;
public Pizza orderPizza(String type) {
Pizza pizza;
pizza=factory.createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
}
这样就完成了一个简单工厂,披萨简单工厂负责处理pizza生成的细节。披萨店铺负责处理披萨打包切割准备的细节。这样可以如果需要修改pizza的种类,则无需去披萨店铺类中修改,只需对对症下药去工厂处修改即可。简单工厂用法在于将功能分化,利于后期的版本迭代。
热身完毕!进入工厂方法模式以及抽象工厂方法模式的学习把!
工厂方法模式
还是披萨店=。=,现在有两个分店噢,一个纽约披萨店,一个芝加哥披萨店,如果再用简单工厂方法,就需要在简单工厂里面再做修改=。=,不能让每个地区的门店自由修改他们的风味。
这时候工厂方法登场啦
- 声明一个工厂方法
public abstract class PizzaStore {
public Pizza orderPizza(String type) {
Pizza pizza;
createPizza(type);
pizza.prepare();
pizza.bake();
pizza.cut();
pizza.box();
return pizza;
}
protected abstract Pizza createPizza(String type);
}
- 创建地区分店
public class NYPizzaStore extends PizzaStore {
Pizza createPizza(String item) {
if (item.equals("cheese")) {
return new NYStyleCheesePizza();
} else if (item.equals("veggie")) {
return new NYStyleVeggiePizza();
} else if (item.equals("clam")) {
return new NYStyleClamPizza();
} else if (item.equals("pepperoni")) {
return new NYStylePepperoniPizza();
} else return null;
}
}
调用代码
public static void main(String[] args) {
PizzaStore nyStore = new NYPizzaStore();
//PizzaStore chicagoStore = new ChicagoPizzaStore();
Pizza pizza = nyStore.orderPizza("cheese");
System.out.println("Ethan ordered a " + pizza.getName() + "\n");
看一下uml图
这就是工厂模式的体现:让子类决定要实例的类是哪一个?即生产出怎么样的产品。即让地方披萨店自己做主,来实现披萨的生成。
接下来贴出真正的工厂模式的uml图。
对比我们的披萨店uml图其实就是多了点产品的uml图而已,基本都是一样,加了一条具体工厂依赖与具体的产品。总结就是工厂方法模式将具体的实现放在子类之中,仅仅提供一个抽象方法规范。
抽象工厂方法模式
老披萨店了,,,,这次加入了原料的问题,不同的地域需要使用不同的原料
如果理解了上门工厂方法再来理解这个应该不难。
直接给出抽象方法模式的uml图,。
这里偷懒啦。其实抽象工厂模式就是提供一个接口,用于创建相关的一组相关产品,其实抽象工厂的方法经常以工厂方法来进行实现,抽象工厂的任务就是定义一个负责创造一组产品的接口,这个接口里的每个方法都负责创造一个具体产品,我们利用实现抽象工厂的子类来提供这些具体的做法,所以在抽象工厂中利用工厂方法实现生成方法是自然的。