工厂方法【Factory Method】模式个人领悟
前言:最近在学习C#设计模式,学习资料主要是:《C#设计模式》一书,李建中老师的 【C#面向对象设计模式纵横谈\C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)】讲座,
吕震宇老师的C#设计模式(5)-Factory Method Pattern。我想从一个初学者的角度来讲解下自己的体会。
工厂的意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,Factory Method 使一个类的实例化延迟到其子类。
客户程序:
1:对客户程序的理解和重视是很重要,我在刚开始学习的时候理解得很狭隘,以为客户程序是在三层结构中表示层使用,其实这里客户程序与三层结构中任何一层都没有必然的联系。往往客户程序供表示层使用。
2:李建中老师讲:设计模式的最要重的思想是:封装变化点--哪里变化,封装哪里。
个人理解是:在自己的项目中应用设计模式时,需要明白哪里地方是相对稳定,哪里地方是变化的,对于变化部分,将其封装起来。在工厂方法模式中,客户程序应该是相对稳定,客户程序无论怎么写,都不依赖于具体实现,依赖于抽象类或接口。
例子:有一个网站用来发布招商项目,对于项目信息,有三种人对其操作,普通浏览者,发布项目信息的会员,网站管理员。
//项目操作抽象类
using System;
namespace ImportFund
{
public abstract class Operator
{
}
}
//普通浏览者操作
namespace ImportFund
{
public class BrowserOperator: Operator
{
//主要操作有搜索单条项目信息。
public Project Select(Int32 id)
{
.......
}
//搜索多项信息
public IList SelectList(Int32 id)
{
.......
}
}
}
//发布项目的会员,继承普通浏览者操作,
namespace ImportFund
{
public class MemberOperator: BrowserOperator
{
// 会员拥有修改项目的功能。
public void update()
{
.....
}
}
}
//管理员操作。
namespace ImportFund
{
public class AdministratorOperator: MemberOperator
{
}
}
//抽象工常类
namespace ImportFund
{
public abstract class OperatorFactory
{
public abstract Operator CreateOperator();
}
}
//具体工厂类:普通浏览者操作工厂。//对应定义:让子类决定实例化哪一个类
namespace ImportFund
{
public class BrowserOperatorFactoy: OperatorFactory
{
public override Operator CreateOperator()
{
return new BrowserOperator();
}
}
}
//具体工厂类:发布项目的会员操作工厂。// 对应定义:让子类决定实例化哪一个类
namespace ImportFund
{
public class MemberOperatorFactory: OperatorFactory
{
public override Operator CreateOperator()
{
return new MemberOperator();
}
}
}
//具体工厂类:管理员操作工厂。 //对应定义:让子类决定实例化哪一个类
namespace ImportFund
{
public class AdministratorOperatorFactory: OperatorFactory
{
public override Operator CreateOperator()
{
return new AdministratorOperator();
}
}
}
//客户程序
namespace ImportFund
{
public class OperatorManager
{
private Operator _operator;
private OperatorManager(OperatorFactory operatorFactory)
{
this._operator = operatorFactory.CreateOperator();
}
public Operator GetOperator
{
get
{
return this._operator;
}
}
}
}
客户是相对稳定的,无论怎么写,都不依赖于具体实现,依赖于抽象类或接口。在上面的客户程序中,
用到的是:抽象的操作类Operator, 抽象的工厂类【参数】:OperatorFactory。
//调用客户程序
namespace ImportFund
{
public class App
{
new OperatorManager(???????).GetOperator;
}
}
在???????这里,根据自己的需要来放入不同的工厂类。不变化的是客户程序中的逻辑以及客户程序中依赖的抽象类或接口。
在以后如果一个超级管理员时,上面的代码都不变化,变化的是:添加一个超级管理员操作工厂类,超级管理员操作类。
以上纯属于个人理解。请各位高手指点。。。