工厂方法模式
工厂方法(FactoryMethod)模式:是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。也就是说核心工厂类不再负责产品的创建,仅负责具体工厂子类必须实现的接口就行。这样抽象的好处是显而易见的,我们不再需要去修改具体工厂的角色了。
例如下面的代码:是一个即将毕业的大学生,以学雷锋做好事的名义去帮助一位老人:
[csharp]
//雷锋类
class LeiFeng
{
public void Sweep()
{
Console.WriteLine("扫地");
}
public void Wash()
{
Console.WriteLine("洗衣");
}
public void BuyRice()
{
Console.WriteLine("买米");
}
}
//“学雷锋的大学生”类,继承雷锋
class UnderGraduate : LeiFeng
{
}
//客户端代码
static void Main(string[] args)
{
LeiFeng xueleifeng = new UnderGraduate();
xueleifeng.Wash();
xueleifeng.Sweep();
xueleifeng.BuyRice();
}
现在如果添加人数,例如共3位同学做这些事,那么只需要实例化三个“学雷锋的大学生”对象了:
[csharp]
//客户端代码
static void Main(string[] args)
{
LeiFeng student1 = newUnderGraduate();
student1.Wash();
LeiFeng student2 = newUnderGraduate();
student2.Sweep();
LeiFeng studen3 = newUnderGraduate();
studen3.BuyRice();
}
这时候就有人有异议了,难道只能大学生去学雷锋做好事吗?我们中学生也可以尽一己之力的。于是,这时候就不是单单实例化多个对象的问题了。
于是雷锋工厂就来了。
[csharp]
//雷锋工厂
interface Ifactory
{
LeiFeng CreateLeiFeng();
}
//“学雷锋的大学生”工厂
class UnderGraduateFactory : Ifactory
{
public LeiFeng CreateLeiFeng()
{
return new UnderGraduate() ;
}
}
//“学雷锋的中学生”工厂
class MiddleStudentFactory : Ifactory
{
public LeiFeng CreateLeiFeng()
{
return new MiddleStudent();
}
}
客户端调用的时候只需要这样就可以了:
[csharp]
//客户端代码
static void Main(string[] args)
{
//工厂方法模式
Ifactory factory = newUnderGraduateFactory(); //要换成“中学生”,修改这里就行
LeiFeng student =factory.CreateLeiFeng();
student.BuyRice();
student.Wash();
student.Sweep();
}
这时候怎么样,想换成中学生还不容易吗?
通过以上的代码,我们可以看到,工厂方法克服了简单工厂违背“开放-封闭原则”的缺点,又保持了封装对象创建过程的优点,降低了客户程序与产品对象的耦合。可以说工厂方法模式是简单工厂模式的进一步抽象和推广。
可是有一个问题,当我们每增加一个产品时,都需要加一个产品工厂的类,很显然会增加额外的开发量,那该怎么办呢?这又要说到-“反射”了。不过此篇博客不会细讲,在以后的抽象工厂模式中会有详解。
补充:软件开发 , C# ,