推荐阅读:
在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法。
工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使其创建过程延迟到子类进行。把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。
工厂模式要素:
1、抽象工厂(Creator):是工厂方法模式的核心角色,任何在模式中创建的对象的工厂类必须实现这个接口;
2、具体工厂(Concrete Creator):这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象;
3、抽象产品(Product):工厂方法模式所创建的对象的基类,也就是产品对象的共同父类或共同拥有的接口;
4、具体产品(Concrete Product):这个角色实现了抽象产品角色所定义的接口。
下面举个例子用类图来介绍一下上面几个要素之间的关系吧。
命名空间工厂方法模式中包含抽象工厂Factory、具体工厂LeiFactory 、抽象产品Volunteer,具体产品Leifeng 。本案例将向大家展示如何使用简单工厂模式来进行不同的算术运算。
代码实现过程:
1.创建抽象类Volunteer
abstract class Volunteer
{
public abstract void sweep();//扫地
public abstract void cook();//煮饭
public abstract void wash();//洗衣服
}
2.创建具体产品Leifeng
class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}
3.创建抽象工厂Factory
abstract class Factory
{
public abstract Volunteer getvol();
}
4.创建具体工厂LeiFactory
class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}
5.使用该工厂,通过传递类型信息来获取实体类的对象。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 工厂方法模式
{
class Program
{
static void Main(string[] args)
{
Factory fact = new LeiFactory();
Volunteer lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}
从上面代码可以发现:
优点:
1、一个调用者想创建一个对象,只要知道其名称就可以了。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。
整合后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 工厂方法模式
{
class Program
{
//使用工厂方法
static void Main(string[] args)
{
fact = new UniFactory();
lei = fact.getvol();
lei.cook();
lei.sweep();
lei.wash();
}
}
}
//抽象产品基类
abstract class Volunteer
{
public abstract void sweep();
public abstract void cook();
public abstract void wash();
}
//具体产品子类
class Leifeng : Volunteer
{
public override void sweep()
{
Console.WriteLine("雷锋扫地");
}
public override void cook()
{
Console.WriteLine("雷锋煮饭");
}
public override void wash()
{
Console.WriteLine("雷锋洗衣");
}
}
//抽象工厂类
abstract class Factory
{
public abstract Volunteer getvol();
}
//具体工厂
class LeiFactory : Factory
{
public override Volunteer getvol()
{
return (new Leifeng());
}
}
使用工厂方法实现的系统,如果系统需要添加新产品时,我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如,我们我们增加一个人物:“博主”,此时我们只需要定义一个具体工厂——“博主”和具体产品——“博主”子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现(具体指添加case语句)。具体代码为:
//具体工厂——博主
class BloggerFactory : Factory
{
public override Volunteer getvol()
{
return (new BloggerFactory ());
}
}
//具体产品——博主子类
class Blogger: Volunteer
{
public override void sweep()
{
Console.WriteLine("博主扫地");
}
public override void cook()
{
Console.WriteLine("博主煮饭");
}
public override void wash()
{
Console.WriteLine("博主洗衣");
}
}
好了,工厂模式介绍完了,博主也该去扫地,煮饭,洗衣了。