工厂方法(Factory Method)

1.工厂方法(Factory Method)

为什么要有工厂方法?我们知道。每一种设计模式的出现,都是为了解决一些问题的,那么工厂方法想要解决什么问题呢?先看个示例。

Monster m = new Monster();

很简单哈,就是实例化了一个类,那么思考一个问题,如果对象的创建过程过于繁琐或庞大,或该类有可能进行同类型扩展, 那么在这样的简单的去实现就不太好了,这时候我们建议将类的创建单独放到一个类里进行,这个类就叫做工厂。

意图:定义用于创建对象的接口, 但让实现该接口的类决定要实例化哪个类。

画个类图用来表示下。

工厂方法(Factory Method)

奥特曼


这个应该很简单,嗯,来看个复杂的。

工厂方法(Factory Method)

image.png


图中有一个IFactory的接口,里面有两个实现类,UltranmanFactoryWBDFactory,同时还有一个接口叫IMonster,它也有两个实现类,WhiteBoonDemonUltraman,(奥特曼和白骨精)同时这两个类也都依赖于UltranmanFactoryWBDFactory。有点麻烦了,那咱们把这个类图简化一下。如图。

工厂方法(Factory Method)

image.png


这里简单说一下Factory,Factory是对抽象接口的实现也就是创建对象。
说了这么多,接下来看看代码。
先看IFactory.cs

 

namespace FactoryMethod
{
    interface IFactory
    {
        IMonster Create();
    }
}

IMonster.cs

namespace FactoryMethod
{
    interface IMonster
    {
        void Show();
    }
}

Ultraman.cs

using System;

namespace FactoryMethod
{
    class Ultraman:IMonster
    {
        public void Show()
        {
            Console.WriteLine("奥特曼:我们是光的使者,正义的化身");
        }
    }
}

WhiteBoonDemon.cs

using System;

namespace FactoryMethod
{
    class WhiteBoonDemon:IMonster
    {
        public void Show()
        {
            Console.WriteLine("白骨精:哈哈哈哈");
        }
    }
}

UltramanFactory.cs

namespace FactoryMethod
{
    class UltramanFactory:IFactory
    {
        public IMonster Create()
        {
            //..
            return new Ultraman();
        }
    }
}

WBDFactory.cs

namespace FactoryMethod
{
    class WBDFactory:IFactory 
    {
        public IMonster Create()
        {
            //。。。
            return new WhiteBoonDemon();             
        }
    }
}

最后看下main函数如何调用。Program.cs

using System;

namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            IFactory f = new WBDFactory();
            f.Create().Show();
            
            Console.Read();
        }
    }
}

2.结语

A a = new A();
多考虑,是否用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

更多学习资料请关注"爱游戏爱编程"。

工厂方法(Factory Method)

爱游戏爱编程.jpg