Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > VB.NET > 模式设计(二)Factory Method(完整)
【标  题】:模式设计(二)Factory Method(完整)
【关键字】:Factory,Method
【来  源】:http://coffeeliu.cnblogs.com/archive/2006/04/22/382356.html

模式设计(二)Factory Method(完整)

Your Ad Here 博客园 - coffeeliu - 模式设计(二)Factory Method(完整)
posts - 11,  comments - 0,  trackbacks - 0

一、 工厂方法(Factory Method)模式

工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。

 

抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口,这里为Evolution抽象类。

具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。这里为EvolutionToYellow,EvolutionToWirte,EvolutionToBlack三个类

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。这里为Person抽象类

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应,这里为YellowPerson,WritePerson,BlackPerson 三个类。

具体代码(C#):

using System;

namespace Factory_Method
{
    
/// <summary>
    
///============== Program Description==============
    
///Name:FactoryMethod.cs
    
///Objective:FactoryMethod
    
///Date:2006-02-09 
    
///Written By coffee.liu
    
///================================================
    
/// </summary>

    class Class1
    
{
        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main(string[] args)
        
{
            Evolution yev
=new EvolutionToYellow();
            Evolution bev
=new EvolutionToBlack();
            Evolution wev
=new EvolutionToWrite();
            Person yp
=yev.evolution();
            yp.GetInfo();
            yp.Say();
            Console.WriteLine(
".");
            Person bp
=bev.evolution();
            bp.GetInfo();
            bp.Say();
            Console.WriteLine(
".");
            Person wp
=wev.evolution();
            wp.GetInfo();
            wp.Say();
        }

    }

    
public abstract class Person
    
{
        
protected string sex,race;
        
public string GetSex()
        
{
            
return sex;
        }

        
public string GetRace()
        
{
            
return race;
        }

        
public abstract void GetInfo();
        
public abstract void Say();
    }


    
public class YellowPerson:Person
    
{
        
public YellowPerson()
        
{
            sex
="Man";
            race
="Yellow";
        }

        
public YellowPerson(string Ysex)
        
{
            sex
=Ysex;
            race
="Yellow";
        }

        
public override void GetInfo()
        
{
            Console.WriteLine(
"the "+race+" Person Info:"+sex); 
        }

        
public override void Say()
        
{
            Console.WriteLine(
"I am a Yellow Baby");
        }


    }


    
public class BlackPerson:Person
    
{
        
public BlackPerson()
        
{
            sex
="Man";
            race
="Black";
        }

        
public BlackPerson(string Bsex)
        
{
            sex
=Bsex;
            race
="Black";
        }

        
public override void GetInfo()
        
{
            Console.WriteLine(
"the "+race+" Person Info:"+sex); 
        }

        
public override void Say()
        
{
            Console.WriteLine(
"I am a Black Baby");
        }

    }


    
public class WritePerson:Person
    
{
        
public WritePerson()
        
{
            sex
="Man";
            race
="Write";
        }

        
public WritePerson(string Wsex)
        
{
            sex
=Wsex;
            race
="Write";
        }

        
public override void GetInfo()
        
{
            Console.WriteLine(
"the "+race+" Person Info:"+sex); 
        }

        
public override void Say()
        
{
            Console.WriteLine(
"I am a Write Baby");
        }

    }

    
public abstract class Evolution{
         
public abstract Person evolution();
    }

    
public class EvolutionToYellow:Evolution
    
{
        
public override Person evolution()
        
{
            
return new YellowPerson();
        }


    }

    
public class EvolutionToBlack:Evolution
    
{
        
public override Person evolution()
        
{
            
return new BlackPerson();
        }

    }

    
public class EvolutionToWrite:Evolution
    
{
        
public override Person evolution()
        
{
            
return new WritePerson();
        }

    }

    
}

程序代码(Pascal)
program FactoryMethod;
     
//============== Program Description==============
    
//Name:FactoryMethod.dpr
    
//Objective:FactoryMethod
    
//Date:2006-04-23
    
//Written By coffee.liu
    
//================================================
{$APPTYPE CONSOLE}

uses
  SysUtils;
  type Person
=class
       
protected
        sex:
string;
        race:
string;
        
public function GetSex():string;
        
public function GetRace():string;
        
public procedure GetInfo;virtual;abstract;
        
public procedure say;virtual;abstract;

   
end;
   type YellowPerson
=class(Person)
       constructor YellowPerson();
        
public procedure GetInfo;override;
        
public procedure Say;override;
     
end;
    type BlackPerson
=class(Person)
       constructor BlackPerson();
        
public procedure GetInfo;override;
        
public procedure Say;override;
     
end;
    type WritePerson
=class(Person)
       constructor WritePerson();
        
public procedure GetInfo;override;
        
public procedure Say;override;
     
end;
    type Evolution
=class
        
public function  evolution():Person;virtual;abstract;
      
end;
    type EvolutionToYellow
=class(Evolution)
        constructor  EvolutionToYellow();
        
public function evolution():Person;override;
     
end;
     type EvolutionToBlack
=class(Evolution)
        constructor EvolutionToBlack();
        
public function evolution():Person;override;
     
end;
     type EvolutionToWrite
=class(Evolution)
        constructor EvolutionToWrite();
        
public function evolution():Person;override;
     
end;
{ Person }

function Person.GetRace: string;
begin
 result:
=race;
end;

function Person.GetSex: string;
begin
  result:
=sex;
end;

{ YellowPerson }

constructor YellowPerson.YellowPerson;
begin
            sex:
='Man';
            race:='Yellow';
end;
procedure YellowPerson.GetInfo;
   begin
    inherited;
      WriteLn(
'the '+race+' Person Info:'+sex);
   end;
procedure YellowPerson.Say;
begin
  inherited;
      WriteLn(
'I am a Yellow Baby');
end;

{ WritePerson }

procedure WritePerson.GetInfo;
begin
  inherited;
     WriteLn(
'the '+race+' Person Info:'+sex);
end;

procedure WritePerson.Say;
begin
  inherited;
      WriteLn(
'I am a Write Baby');
end;

constructor WritePerson.WritePerson;
begin
            sex:
='Man';
            race:='Write';
end;

{ BlackPerson }

constructor BlackPerson.BlackPerson;
begin
            sex:
='Man';
            race:='Black';
end;

procedure BlackPerson.GetInfo;
begin
  inherited;
      WriteLn(
'the '+race+' Person Info:'+sex);
end;

procedure BlackPerson.Say;
begin
  inherited;
     WriteLn(
'I am a Black Baby');
end;

{ EvolutionToBlack }

function EvolutionToBlack.evolution: Person;
begin
    result:
=BlackPerson.BlackPerson;
end;

constructor EvolutionToBlack.EvolutionToBlack;
begin

end;

{ EvolutionToWrite }

function EvolutionToWrite.evolution: Person;
begin
   result:
=WritePerson.WritePerson;
end;

constructor EvolutionToWrite.EvolutionToWrite;
begin

end;

{ EvolutionToYellow }

function EvolutionToYellow.evolution: Person;
begin
     result:
=YellowPerson.YellowPerson;
end;



constructor EvolutionToYellow.EvolutionToYellow;
begin

end;
var