设计模式之 Simple Factory(其实该模式不是23中设计模式之一)

 

Simple Factory


先从Simple Factory开始讲起,假设模拟一个电玩店的试玩系统,这个电玩店专卖出售PS3的游戏机以及相关配件以及提供PS3游戏的试玩服务,当一个用户想试玩的时候,需要选择一种游戏类型进行试玩,系统会选择生成其中一个游戏盘的对象:竞赛游戏(PS3RacingGameDisk),射击游戏(PS3ShootingGameDisk)以及格斗游戏(PS3FightingGameDisk),这些游戏盘子类都分别继承自同一个游戏盘抽象类AbstractGameDisk。

图1

     public   abstract   class  AbstractGameDisk
    {
        
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   class  PS3Player
    {
        
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 LinJake's Blog on 博客园
出处:http://procoder.cnblogs.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值