设计模式 工厂模式 从卖肉夹馍说起(一)

2014-11-23 22:38:30 · 作者: · 浏览: 4

今天继续设计模式之旅,给大家带来工厂模式,简单列一下这个模式的家族:

1、静态工厂模式

2、简单工厂模式

3、工厂方法模式

4、抽象工厂模式

是不是觉得,我勒个去,这工厂还能列出这么多分类,哈哈,下面开始各个击破。

1、静态工厂模式

这个最常见了,项目中的辅助类,TextUtil.isEmpty等,类+静态方法。下面开始详细介绍:略。

2、简单工厂模式

下面开始谈谈卖肉夹馍,最近程序员卖肉夹馍很火,啥时候大牛们都去卖了,我等就崛起了,哈哈。

首先你得有个店:RoujiaMoStore

package com.zhy.pattern.factory.a;

public class RoujiaMoStore
{

	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = null;
		
		if (type.equals(Suan))
		{
			rouJiaMo = new SuanRouJiaMo();

		} else if (type.equals(Tian))
		{
			rouJiaMo = new TianRouJiaMo();
		} else if (type.equals(La))
		{
			rouJiaMo = new LaRouJiaMo();
		}
		
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;
	}

}

然后你得有各种风味的馍馍:

package com.zhy.pattern.factory.a;

public abstract class RouJiaMo
{
	protected String name;

	/**
	 * 准备工作
	 */
	public void prepare()
	{
		System.out.println(揉面-剁肉-完成准备工作);
	}

	/**
	 * 使用你们的专用袋-包装
	 */
	public void pack()
	{
		System.out.println(肉夹馍-专用袋-包装);
	}
	/**
	 * 秘制设备-烘烤2分钟
	 */
	public void fire()
	{
		System.out.println(肉夹馍-专用设备-烘烤);
	}
}

package com.zhy.pattern.factory.a;

import com.zhy.pattern.factory.a.RouJiaMo;

/**
 * 辣味肉夹馍
 * 
 * @author zhy
 * 
 */
public class LaRouJiaMo extends RouJiaMo
{
	public LaRouJiaMo()
	{
		this.name = 辣味肉夹馍;
	}
}

package com.zhy.pattern.factory.a;



/**
 * 酸味肉夹馍
 * 
 * @author zhy
 * 
 */
public class SuanRouJiaMo extends RouJiaMo
{
	public SuanRouJiaMo()
	{
		this.name = 酸味肉夹馍;
	}
}

package com.zhy.pattern.factory.a;



/**
 * 酸味肉夹馍
 * 
 * @author zhy
 * 
 */
public class SuanRouJiaMo extends RouJiaMo
{
	public SuanRouJiaMo()
	{
		this.name = 酸味肉夹馍;
	}
}

现在这样的设计,虽然可以支持你卖肉夹馍了,但是有点问题,生产馍的种类和你的RoujiaMoStore耦合度太高了,如果增加几种风味,删除几种风味,你得一直修改sellRouJiaMo中的方法,所以我们需要做一定的修改,此时简单工厂模式就能派上用场了。

我们开始写个简单工厂,把产生馍的过程拿出来:

package com.zhy.pattern.factory.a;

public class SimpleRouJiaMoFactroy
{
	public RouJiaMo createRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = null;
		if (type.equals(Suan))
		{
			rouJiaMo = new SuanRouJiaMo();

		} else if (type.equals(Tian))
		{
			rouJiaMo = new TianRouJiaMo();
		} else if (type.equals(La))
		{
			rouJiaMo = new LaRouJiaMo();
		}
		return rouJiaMo;
	}

}

然后以组合的方式,让Store来使用:

package com.zhy.pattern.factory.a;

public class RoujiaMoStore
{
	private SimpleRouJiaMoFactroy factroy;

	public RoujiaMoStore(SimpleRouJiaMoFactroy factroy)
	{
		this.factroy = factroy;
	}

	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = factroy.createRouJiaMo(type);
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;
	}

}

好了,现在你随便添加什么种类的馍,删除什么种类的馍就和Store无关了,就是么~人家只负责卖馍么~ 这就是简单工厂模式,当然了,大家也都比较熟悉。

3、工厂方法模式

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

好了,看完定义,下面我们用例子来展示。继续肉夹馍,由于使用了简单工厂模式,肉夹馍生意那个好啊,所以下载决定去西安开个分店,去北京开个分店。既然有分店了,那总店就是抽象的了:

package com.zhy.pattern.factory.b;

public abstract class RoujiaMoStore
{

	public abstract RouJiaMo createRouJiaMo(String type);

	/**
	 * 根据传入类型卖不同的肉夹馍
	 * 
	 * @param type
	 * @return
	 */
	public RouJiaMo sellRouJiaMo(String type)
	{
		RouJiaMo rouJiaMo = createRouJiaM