工厂方法(Factory Method)
1.工厂方法(Factory Method)
为什么要有工厂方法?我们知道。每一种设计模式的出现,都是为了解决一些问题的,那么工厂方法想要解决什么问题呢?先看个示例。
Monster m = new Monster();
很简单哈,就是实例化了一个类,那么思考一个问题,如果对象的创建过程过于繁琐或庞大,或该类有可能进行同类型扩展, 那么在这样的简单的去实现就不太好了,这时候我们建议将类的创建单独放到一个类里进行,这个类就叫做工厂。
意图:定义用于创建对象的接口, 但让实现该接口的类决定要实例化哪个类。
画个类图用来表示下。
奥特曼
这个应该很简单,嗯,来看个复杂的。
image.png
图中有一个IFactory
的接口,里面有两个实现类,UltranmanFactory
和WBDFactory
,同时还有一个接口叫IMonster
,它也有两个实现类,WhiteBoonDemon
和Ultraman
,(奥特曼和白骨精)同时这两个类也都依赖于UltranmanFactory
和WBDFactory
。有点麻烦了,那咱们把这个类图简化一下。如图。
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();
多考虑,是否用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
更多学习资料请关注"爱游戏爱编程"。
爱游戏爱编程.jpg