chenjie0512

工厂方法--初学者理解

                                      工厂方法【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;
   }
}

在???????这里,根据自己的需要来放入不同的工厂类。不变化的是客户程序中的逻辑以及客户程序中依赖的抽象类或接口。
在以后如果一个超级管理员时,上面的代码都不变化,变化的是:添加一个超级管理员操作工厂类,超级管理员操作类。

以上纯属于个人理解。请各位高手指点。。。

posted on 2005-12-26 19:26    阅读(442)  评论(0)    收藏  举报

导航