设计模式——简单工厂模式
需求
在程序设计中,常常需要把对象的创建与使用分离开来,创建型模式都是为了解决此类问题。简单工厂模式是所有工厂模式中最简单的一个,是学习其它模式的基础。许多时候,我们需要一个类来负责根据情况简单地创建类的对象,而客户程序负责使用即可,就可以用到这种模式。
定义
简单工厂由3部分组成:(1)首先定义一个抽象产品类来描述产品规格;(2)再定义各具体的产品类实现抽象产品类描述的规格;(3)再定义一个静态的工厂方法负责根据传入参数来创建具体的实体产品对象,这个静态工厂方法最后写在一个单独的类里。
由于这个工厂方法是静态的,所以简单工厂模式又名静态工厂方法模式(Static Factory Method)。
严格来说,简单工厂模式并不是GoF定义的23种设计模式之一。
案例
class Program
{
static voidMain(string[] args)
{
//客户端程序
IAnimal aTiger = AnimalFactory.CreateAnimal("Tiger");
aTiger.Eat();
IAnimal aParrot = AnimalFactory.CreateAnimal("Parrot");
aParrot.Eat();
}
}
// 抽象产品类:动物接口
public interface IAnimal
{
void Eat();
}
// 实现抽象产品类的具体产品类:老虎
public class Tiger : IAnimal
{
public void Eat()
{
Console.WriteLine("老虎会吃");
}
public void Run()
{
Console.WriteLine("老虎会跑");
}
}
// 实现抽类产品类的具体产品类:鹦鹉
public class Parrot : IAnimal
{
public void Eat()
{
Console.WriteLine("鹦鹉会吃");
}
public void Fly()
{
Console.WriteLine("鹦鹉会飞");
}
}
// 工厂类
public class AnimalFactory
{
// 静态工厂方法
public static IAnimal CreateAnimal(string animalName)
{
if (animalName.Equals("Tiger"))
return new Tiger();
else if (animalName.Equals("Parrot"))
return new Parrot();
else
return null;
}
}
优缺点
优点:
在简单工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了工厂类,客户端直负责对对象的调用,明确了各个类的职责;减少了客户端的代码量和复杂度;利于客户端程序的后期维护。
缺点:
由于工厂类负责所有对象的创建,就需要集中所有实例的创建逻辑,因此所有子类都必须预先考虑到。如果需要添加新的子类,常常需要改变工厂类,增加相应的逻辑判断,不利于后期的维护(某些情况下可以用反射技术来避免修改工厂类)。
某些情况下,要求工厂类根据不同情况创建不同子类对象,各种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。此缺点在工厂方法模式中得到了一定的克服。
由于工厂方法是静态的,静态方法是无法继承的。
适用场景
简单工厂模式只适用于需要创建的对象比较少或者简单的情况;客户端只需要知道传入工厂类的参数,对于创建逻辑并不关心;最好能提前预见后期不太可能添加子类创建。而创建比较复杂的对象时,简单工厂模式不是一个很好的选择。
补充