简单工厂模式的介绍
简单工厂模式可以理解为创建对象的一个类
意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
关键代码:创建过程在其子类执行。
应用实例:
- 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。
- Hibernate 换数据库只需换方言和驱动就可以。
使用场景:
- 当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式
- 客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
简单工厂模式的UML图
简单工厂模式的实现
实例:客户吃饭可以自己炒菜吃,但是自己炒菜太麻烦,可以到餐馆点菜就可以了,买菜的事情就交给餐馆做就可以了,这里餐馆就充当简单工厂的角色,下面让我们看看现实生活中的例子用代码是怎样来实现的。
抽象类Food:
using System;
namespace DesignModelDemo.Factory
{
abstract class Food
{
public abstract void Print();
}
}
PotatoFood:Food:
using System;
namespace DesignModelDemo.Factory
{
class PotatoFood:Food
{
public override void Print()
{
Console.WriteLine("炒好了一盘土豆丝...");
}
}
}
TomatoFood :
using System;
namespace DesignModelDemo.Factory
{
class TomatoFood : Food
{
public override void Print()
{
Console.WriteLine("炒好一盘西红柿...");
}
}
}
Customer:
using System;
namespace DesignModelDemo.Factory
{
class Customer
{
//public static Food Cook(FoodType foodType)
//{
// Food food = null;
// switch (foodType)
// {
// case FoodType.Tomato:
// food = new TomatoFood();
// break;
// case FoodType.Potato:
// food = new PotatoFood();
// break;
// }
// return food;
//}
static void Main(string[] args)
{
//Cook(FoodType.Tomato).Print();
FoodFactory.CookFood(FoodType.Potato).Print();
Console.Read();
}
}
}
FoodFactory:
using System;
namespace DesignModelDemo.Factory
{
class FoodFactory
{
public static Food CookFood(FoodType foodType)
{
Food food = null;
switch (foodType)
{
case FoodType.Potato:
food = new PotatoFood();
break;
case FoodType.Tomato:
food = new TomatoFood();
break;
}
return food;
}
}
}
简单工厂模式的优缺点
优点:
- 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。
- 简单工厂模式也起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。(同时这点也是简单工厂方法的缺点——因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响,也没什么不好理解的,就如事物都有两面性一样道理)
缺点:
- 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响(通俗地意思就是:一旦餐馆没饭或者关门了,很多不愿意做饭的人就没饭吃了)
- 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。