设计模式之工厂模式

来源:互联网 发布:机器人d-h算法 编辑:程序博客网 时间:2024/05/29 16:20

这几天小乔突然喜欢上了做饭,每次都亲自去菜场买食材然后回家做,俨然一副家庭主妇的摸样。每次回到家都想吃到小乔做的可口饭菜,但是呢小乔是个做事精益求精的主妇,她对每一道菜品都要精雕细琢,导致每次出菜都要等好久,后来大家实在饿的受不了了,就跟小乔反应了这个问题,你菜虽然做的好吃但是不能这么慢一道一道出呀,能不能几个一起做啊,这样不就快了嘛!小乔听了以后,第二天就去多买了口锅,一个锅炖牛肉,一个锅炒菜,这样下来不一会就能出两个菜了,而且两个菜口味各异非常好吃。:)

以上例子纯属于一个引例,来引出今天要讲的设计模式-----工厂模式。

 工厂模式的使用频率与范围都很广,其定义是:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

工厂方法的类图如:




在工厂方法模式中,抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义,Creator为抽象创建类,也就是抽象工厂,具体如何创建产品类是由具体的实现工厂ConcreteCreator完成的,接下来我们来看一个实例。

package com.org;public interface Dish {//口味public void taste();//营养public void nutrition();}

==========================================

package com.org;import com.org.Dish;public class BoiledBeef implements Dish{@Overridepublic void taste() {// TODO Auto-generated method stubSystem.out.println("水煮牛肉尝起来香辣可口");}@Overridepublic void nutrition() {// TODO Auto-generated method stubSystem.out.println("水煮牛肉给你提供了蛋白质");}}
==========================================

package com.org;import com.org.Dish;public class ChickenWings implements Dish{@Overridepublic void taste() {// TODO Auto-generated method stubSystem.out.println("可乐鸡翅尝起来甜甜的");}@Overridepublic void nutrition() {// TODO Auto-generated method stubSystem.out.println("可乐鸡翅给你提供糖份");}}


==========================================

package com.org;import com.org.Dish;public class Carrot implements Dish {@Overridepublic void taste() {// TODO Auto-generated method stubSystem.out.println("胡萝卜尝起来脆脆的");}@Overridepublic void nutrition() {// TODO Auto-generated method stubSystem.out.println("胡萝卜提供丰富的维生素");}}

==========================================

package com.org;import com.org.Dish;//抽象做菜工厂public abstract class AbstractDishFactory {public abstract <T extends Dish> T createDish(Class<T> className);}

==========================================

package com.org;public class DishFactory extends AbstractDishFactory{@Overridepublic <T extends Dish> T createDish(Class<T> className) {// TODO Auto-generated method stubDish dish = null;try{//制作一道菜品dish = (Dish)Class.forName(className.getName()).newInstance();}catch (Exception e){System.out.println("菜烧糊了");}return (T)dish;}}

==========================================

package com.org;public class Pan {public static void main(String[] args){AbstractDishFactory xiaoqiao  = new DishFactory();//小乔第一次做的是可乐鸡翅Dish cw = xiaoqiao.createDish(ChickenWings.class);cw.taste();cw.nutrition();//小乔第二次做的是水煮牛肉Dish beef = xiaoqiao.createDish(BoiledBeef.class);beef.taste();beef.nutrition();//小乔第三次做的是胡萝卜Dish carrot = xiaoqiao.createDish(Carrot.class);carrot.taste();carrot.nutrition();}}

运行结果如下:

可乐鸡翅尝起来甜甜的

可乐鸡翅给你提供糖份

水煮牛肉尝起来香辣可口

水煮牛肉给你提供了蛋白质

胡萝卜尝起来脆脆的

胡萝卜提供丰富的维生素



工厂方法模式的优点:

1.具有良好的封装性,代码优美结构清晰。

2.对象的创建简单,只要知道这个对象的类名就可以了,不用去了解对象创建的过程,降低模块间的耦合。

3.工厂模式的扩展性很强,在增加产品的时候,只要适当的修改具体的工厂类或扩展一个工厂类就可以完成。例如,在我们的例子中,我们要增加一个西红柿炒蛋只要增加一个西红柿炒蛋的类即可,工厂类无需做任何变化。

4.屏蔽产品类,这一点很重要,产品类的实现如何变化,调用者不用关心,只需要关心产品的接口,只要接口保持不变,系统中的上层模块就不要发生变化。


好了,这篇文章就到这,有争议的地方希望大家指出来纠正,共同学习进步。

0 0