设计模式详解之————工厂模式(一)

引言

假设我们有一个炒饭店,我们设计的类可能是下边这个样子的:
(1)首先有个Rice的接口类,有着Rice的共性。
(2)每个种类的炒饭继承自Rice,实现接口方法。
(3)还应该有一个销售炒饭的入口,表示客户想要预订哪种炒饭。
(4)既然有销售炒饭的入口,那么也必须有生产炒饭的类。

工厂模式的概念

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

工厂模式的分类

  • 静态(简单)工厂:
    通过静态工厂实现我们的炒饭店,基本做法是这样的:
    (1)定义Rice抽象类
package 工厂模式.静态工厂;
/**
 * Author:haozhixin
 * Func:  静态工厂
 * Date:  20190814
 */
public abstract class Rice {
	public abstract void createRice();
}

(2)我们这个炒饭店的所有炒饭,目前就俩(一个鸡味儿饭,一个蛋炒饭继承Rice)

package 工厂模式.静态工厂;

/**
 * Author:haozhixin
 * Func:  静态工厂
 * Date:  20190814
 */
public class ChikenRice extends Rice {
	@Override
	public void createRice() {
		System.out.println("做了个鸡味儿炒饭");
	}
}

package 工厂模式.静态工厂;

/**
 * Author:haozhixin
 * Func: 静态工厂
 * Date: 20190814
 */
public class EggRice extends Rice {
	@Override
	public void createRice() {
		System.out.println("做了个蛋炒饭");
	}
}

(3)生产炒饭的工厂(点单处)

package 工厂模式.静态工厂;

/**
 * Author:haozhixin
 * Func:
 * Date:
 */
public class SimpleRiceFactory {

	public static Rice createNoodles(int type) {
		switch (type) {
			case 1:
				return new ChikenRice();
			case 2:
				return new EggRice();
			default:
				return null;
		}
	}
	public static void main(String[] args){
		createNoodles(1);
		createNoodles(1);
	}
}

我们来总结下:
1 静态工厂类是一个具体的类,非接口 抽象类。有一个重要的create()方法,利用if或者 switch创建产品并返回。
2 create()方法通常是静态的,所以也称之为静态工厂。

我们通过看静态工厂的例子,基本能够想到就是我们平常在开发中常用的代码书写规范,没错,是一种约定俗成的规范,而且上边的我们的实现还有一个重要的问题。

(1)拓展性差(我想增加一种面条,除了新增一个面条产品类,还需要修改工厂类方法)
(2)不同的产品需要不同额外参数的时候 不支持。
所以衍生了一种多方法静态工厂的实现,其中类是这么写的。

package 工厂模式.静态工厂;

/**
 * Author:haozhixin
 * Func: 多方法静态工厂模式
 * Date: 20190814
 */
public class MulWayFactory {
	public static Rice createChikenRice(){
		return new ChikenRice();
	}
	public static Rice createEggRice(){
		return new EggRice();
	}

	public static void main(String[] args){
		createChikenRice().createRice();
	}
}
  • 普通工厂方法
    (1)普通工厂方法只是将简单工厂的工厂抽象出来,每一种炒饭有一个工厂类
package 工厂模式.抽象工厂;

/**
 * Author:haozhixin
 * Func: 普通工厂模式
 * Date: 20190814
 */
public abstract class RiceFactory {
	public abstract Rice create();
}

(2)每个炒饭有自己的工厂类

package 工厂模式.普通工厂;

/**
 * Author:haozhixin
 * Func: 普通工厂
 * Date: 20190814
 */
public class ChikenRiceFacory extends RiceFactory{
	@Override
	public Rice create() {
		return new ChikenRice();
	}
}

(2)每个炒饭有自己的工厂类

package 工厂模式.普通工厂;

/**
 * Author:haozhixin
 * Func: 普通工厂
 * Date: 20190814
 */
public class EggRiceFacory extends RiceFactory {
	@Override
	public Rice create() {
		return new EggRice();
	}
}

(3)下单的类

package 工厂模式.普通工厂;
/**
 * Author:haozhixin
 * Func: 普通工厂
 * Date: 20190814
 */
public class RiceStore {
	public static void main(String args[]){
		ChikenRiceFacory chikenRiceFacory = new ChikenRiceFacory();
		chikenRiceFacory.create().createRice();
	}
}

我们来总结下普通工厂的特点:
产品要抽象, 工厂也需要抽象。
工厂方法使一个产品类的实例化延迟到其具体工厂子类。
工厂方法的好处就是更拥抱变化。当需求变化,只需要增删相应的类,不需要修改已有的类。

  • 抽象工厂

抽象工厂的特点是面对多产品系的类设计,这个类的结构复杂,而且使用的不恰当容易引起类爆炸,当前就不介绍了,大家能把以上的掌握了在工作中基本没什么问题。以后有机会我会把抽象工厂的应用场景结合思想及坑点来分析一下。

大家觉得不错的话点个赞哦~


作者:select you from me
来源:CSDN
转载请联系作者获得授权并注明出处。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值