Simple Factory
先从Simple Factory开始讲起,假设模拟一个电玩店的试玩系统,这个电玩店专卖出售PS3的游戏机以及相关配件以及提供PS3游戏的试玩服务,当一个用户想试玩的时候,需要选择一种游戏类型进行试玩,系统会选择生成其中一个游戏盘的对象:竞赛游戏(PS3RacingGameDisk),射击游戏(PS3ShootingGameDisk)以及格斗游戏(PS3FightingGameDisk),这些游戏盘子类都分别继承自同一个游戏盘抽象类AbstractGameDisk。
图1
{
public string Name { get ; set ; }
public abstract void Load();
}
public class PS3RacingGameDisk : AbstractGameDisk
{
public override void Load()
{
Console.WriteLine( " Load PS3 racing game. " );
}
}
public class PS3ShootingGameDisk : AbstractGameDisk
{
public override void Load()
{
Console.WriteLine( " Load PS3 shooting game. " );
}
}
public class PS3FightingGameDisk : AbstractGameDisk
{
public override void Load()
{
Console.WriteLine( " Load PS3 fighting game. " );
}
}
public enum GameDiskType
{
RACING,
SHOOTING,
FIGHTING
}
public class PS3Player
{
public void PlayAGame(GameDiskType type)
{
// Get a console
// Get a joystick
// create a game disk
AbstractGameDisk disk;
switch (type)
{
case GameDiskType.RACING:
disk = new PS3RacingGameDisk();
break ;
case GameDiskType.SHOOTING:
disk = new PS3ShootingGameDisk();
break ;
case GameDiskType.FIGHTING:
disk = new PS3FightingGameDisk();
break ;
default :
disk = null ;
break ;
}
// insert disk to console
// load game
// play and enjoy it
}
}
代码1
从上述代码看,如果我们需要增加新的游戏盘,例如角色扮演游戏(RolePlayGameDisk),那么生成游戏盘部分(见注释create a game disk处)需要增加case分支,这里存在着对具体游戏盘的对象实例化变化的需求。根据"对变化进行封装(Encapsulate what varies)"这一设计原则,对这个对象实例化的需求进行封装。 引入一个新的类来封装和处理对象生成的需求,这个类叫做PS3DiskFacotry。
{
public void PlayAGame(GameDiskType type)
{
// Get a console
// Get a joystick
// create a game disk
AbstractGameDisk disk = PS3DiskFactory.CreateGameDisk(type);
// insert disk to console
// load game
// play and enjoy it
}
}
public sealed class PS3DiskFactory
{
public static AbstractGameDisk CreateGameDisk(GameDiskType type)
{
switch (type)
{
case GameDiskType.RACING:
return new PS3RacingGameDisk();
case GameDiskType.SHOOTING:
return new PS3ShootingGameDisk();
case GameDiskType.FIGHTING:
return new PS3FightingGameDisk();
default :
return null ;
}
}
}
代码2
从上面的代码看PS3DiskFactory专门负责游戏盘(AbstractGameDisk的具体子类)的实例化过程,当有新的游戏盘增加时,也就是实例化过程的需求发生变化时,全部变化会单独发生在PS3DiskFactory里面,也就是可变化的需求被封装到一个类里面了,这就是Simple Factory的实现。
Simple Factory就是把对象实例化过程的需求封装到一个Factory类里面,把实例化过程的变化限制到该Factory类里面。Simple Factory不是GoF的模式之一,却应用十分广泛,Abstract Factory等模式可以借助Simple Factory来实现。
图2
在上面图2上PS3DiskPlayer是一个Client类,由于对实例化需求的变化的封装,PS3DiskPlayer和具体的游戏盘类(PS3RacingGameDisk,PS3ShootingGameDisk和PS3FightingGameDisk等)彻底的解耦,PS3DiskPlayer只是依赖于他们共同的抽象类AbstractGameDisk和工厂类PS3DiskFactory。Simple Factory的作用就是用来“封装对象实例化可变化的需求”。
作者:Jake Lin(Jake's Blog on 博客园)
出处:http://procoder.cnblogs.com