Fork me on GitHub

设计模式(C#)——02工厂模式

推荐阅读:

       在简单工厂模式中讲到简单工厂模式的缺点:难以扩展,一旦添加新运算就必须修改简单工厂方法。
      工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使其创建过程延迟到子类进行。把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口。
 工厂模式要素:

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("博主洗衣");
    }
}

好了,工厂模式介绍完了,博主也该去扫地,煮饭,洗衣了。

posted @ 2019-01-09 16:28  爱上游戏开发  阅读(303)  评论(0编辑  收藏  举报
 >>>转载请注明出处