设计模式-工厂模式

设计模式——工厂模式


工厂模式:工厂模式是我们最常用的实例化对象的模式,是用工厂方法替代new操作的一种模式。工厂模式在我们的java代码中随处可见,工厂模式就相当于创建实例对象的new,有的时候我们经常根据类生成类的实例对象,这个时候我们就需要考虑一下了,是否可以考虑用工厂模式替代原有的方法了,虽然我们用工厂模式可能多做一些工作,但是这样的方法会给系统带来更大的可扩展性和尽量少的修改代码。


工厂模式的分类

                             1、静态工厂模式

                             2、简单工厂模式

                             3、工厂方法模式

                             4、抽象工厂模式


1、静态工厂模式:

例如项目中的工具类,TextUtil.isEmpty等,类+静态方法;实例:略。


2、简单工厂模式:

这是一个非常简单的例子,例子的创意来源于我的偶像鸿洋的博客(代码都是我手写的),我们现在要做一个加工肉夹馍的例子让大家感受一下工厂模式,下面让我们一起分析一下:



(在这里我们一共有六个类,分别是肉夹馍的销售类,肉夹馍类,还有三种口味的肉夹馍类,还有一个测试类)


RoujiaMoStore.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class RoujiaMoStore {

	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;

	}

}
</span>

RouJiaMo.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class RouJiaMo {

	protected String name;

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

	public void pack() {
		System.out.println("肉夹馍-专用袋-包装");
	}

	public void fire() {
		System.out.println("肉夹馍-专用设备-烘烤");
	}

}</span>

LaRoujiaMo.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class LaRoujiaMo extends RouJiaMo {

	public LaRoujiaMo() {

		this.name = "辣肉夹馍";
		System.out.println("我是辣肉夹馍");
	}

}</span>

SuanRoujiaMo.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class SuanRoujiaMo extends RouJiaMo {

	public SuanRoujiaMo() {

		this.name = "酸肉夹馍";
		System.out.println("我是酸肉夹馍");
	}

}</span>

TianRouJiaMo.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class TianRouJiaMo extends RouJiaMo {

	public TianRouJiaMo() {

		this.name = "甜肉夹馍";
		System.out.println("我是甜肉夹馍");

	}

}
</span>

Test.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class Test {

	public static void main(String[] args) {

		RoujiaMoStore r1 = new RoujiaMoStore();

		r1.sellRouJiaMo("Tian");

	}

}
</span>

这样我们的销售肉夹馍的整个工程就写完了,但是这里了我们的销售方法里面的方法和我们的肉夹馍的种类耦合度太高了,无论是增加一种新的肉夹馍的方法,还是删除一种肉夹馍的方式,都需要修改store里面的代码的,我认为这样很不好的,所以在这里我们需要增加我们的工厂的概念了,所以我们作了如下的举动,这也就让我们的简单的工厂模式派上用场了。


SimpleRouJiaMoFactory.java:

<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class SimpleRouJiaMoFactory {

	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();

		}

		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		return rouJiaMo;

	}

}
</span>

RoujiaMoStore.java:
<span style="font-size:18px;">/*
 * @author lin_sir;
 * date:2016-1-31
 */

public class RoujiaMoStore {

	private SimpleRouJiaMoFactory factory;

	public RoujiaMoStore(SimpleRouJiaMoFactory factory) {
		this.factory = factory;
	}

	public RouJiaMo sellRoujiaMo(String type) {

		RouJiaMo rouJiaMo = factory.createRouJiaMo(type);
		rouJiaMo.prepare();
		rouJiaMo.fire();
		rouJiaMo.pack();
		
		return rouJiaMo;

	}

}
</span>

通过以上的改动,我们的简单的工厂模式也就成型了。


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



4、抽象工厂模式:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。//TODO
























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值