工厂模式

为什么要用工厂模式而不用简单工厂

工厂方法是简单工厂的延申,准确的说是简单工厂的改善版本。简单工厂可以实现对象的实例与使用分离,但是却不能保证开闭原则。所以在工厂模式下,可以实现在开闭原则的基础上实现分离。

创建对象

还是用简单工厂的例子,我可能需要辣椒或者香菜。

//简单工厂
class Factory_Vegetables
{
	public static Vegetables Creat(string what)
	{
		//辣椒
		if Chili
		return new Chili();
		//香菜
		else if Coriander
		return new Coriander();
		else
		return null;
	}
}

回想一下,简单工厂之于普通的实例对象。不就是将所有的蔬菜类实现了接口,从而实现面向接口的编程,通过依赖倒置来实现开闭原则。
那么我们是不是也可以对工厂使用依赖倒置呢。
如果问题想到这里,差不多解决方法就出来了。没有明白的继续看例子。

工厂模式

简单工厂就是在产品类中集成了一个总类接口,所有产品实现接口,在工厂中所有的产品返回都是此接口的子类,也就是进行了隐式转换。这里依赖倒置的妙处就逐渐体现出来了,在最刚开始的时候,提到过这样一句话,当时可能不是很懂,这里再拿出来理解一下

开闭原则是目标,李氏代换原则是基础,依赖倒置原则是手段。

这里就很直观的感受到了什么是依赖倒置原则,怎么去通过依赖倒置来达到开闭的目标。

也就是说简单工厂模式在某些方面是实现了开闭原则的,比如说产品的实例就没有必要改实例的代码了,不符合的地方也就是工厂中无法固定所有的产品种类。这里一定要搞清楚哪里是要优化的,那里是要当作优点保留的。
优点保留部分
1.实例与使用分离
2.产品类中依赖倒置原则的使用
优化改正部分
1.工厂类的职责过重
2.工厂类不符合开闭原则

产品部分

这里保留简单工厂的产品层次结构。

//产品类
class Vegetable
{
	void EatIt();
}
class Chili:Vegetable
{
	public void EatIt()
	{
		//吃辣椒
	}
}
class Coriander:Vegetble
{
	public void EatIt()
	{
		//吃香菜
	}
}

工厂方面

仿照产品方面,采用独立工厂,通过实现总工厂接口来实现开闭原则,也就是通过增加独立工厂类来实现添加实例产品。

interface IFactory
{
	Vegetable Create();
}
//辣椒工厂
class ChiliFactory:IFactory
{
	public Vegetable Create()
	{
		return new Chili();
	}
}
//香菜工厂
class CorianderFactory:IFactory
{
	public Vegetable Create()
	{
		return new Coriander();
	}
}

实现工厂模式的创建

void Main()
{
	IFactory factory;
	Vegetable vegetable;
	factory= new ChiliFactory();
	vegetable=factory.Create();
}

也就是说,相对于简单工厂而言,工厂模式将工厂的搭建是实时搭建的,也就是当你想要什么产品时,我就搭建什么工厂。
这里很多人会有这样的疑问,为什么非要先实例工厂,在通过工厂实例产品呢,直接实例产品不就得了。关于这个问题,确实是思想上的怪圈,这次你想通了下次遇到工厂模式还是会考虑同样的问题。因为基本上所有的工厂模式讲解中所举的例子都十分的简单,产品类中没有相对复杂的逻辑,这样就无法体现出创建与使用分离的好处。(其实目的就是为了降低单一类的耦合度)对于这样的学者,推荐你自己将工厂模式敲进自己的项目中,用一用就明白了。

关于开闭原则

  • 增加产品的开闭性

可以看到,想要添加产品种类时,不同于简单工厂的修改工厂类,工厂模式则是通过增加工厂类来满足开闭原则。对一款产品多一个具体工厂,确实是实现了开闭原则,但是代码量一下子就上来了。就比如同一家汽车生产商要生产型号不同的汽车你就要开不同的工厂,着实麻烦。关于这点,咱们先不做考虑,抽象工厂模式下会再次进行优化。

  • 修改产品的开闭性

如果项目需求改变了,就像是上面举的例子,我不在需要辣椒了,现在要改成香菜,那岂不是还要修改源码。为了避免这种情况的出现,在Main方法中实例工厂方面我们采用读取配置文件,然后再通过反射机制动态实例。(简单工厂也可以这么用,但是无法解决增加产品的开闭性)关于读取配置文件,点击这里。反射动态实例,点击这里

拓展—工厂方法的隐藏

当你的产品内的逻辑相对简单时,可以将产品内的方法,比如例子中的EatIt,可以写入工厂中的Create方法中。这样就不必在Main方法中在此对EatIt方法进行调用,类似于构造函数的用法。

关于工厂模式的优缺点

优点
1.将产品的实例与使用分离,分离了代码的耦合度。
2.相比与简单工厂模式,更符合开闭设计原则。
缺点
1.代码十分冗杂,给系统带来了一些额外的开销

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值