原型模式

原型模式解析

原型模式(Prototype pattern )
为什么要使用原型而不使用new操作符?1.创建对象不需初始化过程;2.保存部分原来对象的信息;3.解决子类爆炸问题。
当一个类族的数量不确定时,但是类与类之间有固定的联系,那么使用原型模式是比较好的解决方案。就向上面说的那样,原型创建新对象并不是通过new一个对象然后初始化来达到创建的目的的。我们只通过对已有对象的复制来实现。就像一俩车的外壳模型一样。我们需要各式各样车的外壳,但是这些外壳都是有固定部分改造而成的,车头,车身和车尾,对于不同的车外壳我们只要改造这个现有的模型而已,而不用重新从一个铁皮开始加工,哪怕我们用的材质不同,所以我们可以先开发一辆车的外壳,然后让所有的外壳都从该外壳上改造,这样即减少来开模的数量,还能节省成本。这就是原型的意义减少初始化的步骤,减少子类。

None.gifpublic enum RecordType
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif    Car,
InBlock.gif    Person
ExpandedBlockEnd.gif }

None.gif 
ExpandedBlockStart.gifContractedBlock.gif 
/**//// <summary>
InBlock.gif 
/// Record is the Prototype
ExpandedBlockEnd.gif 
/// </summary>

None.gif public abstract class Record
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif    
public abstract Record Clone();
ExpandedBlockEnd.gif }

None.gif 
ExpandedBlockStart.gifContractedBlock.gif 
/**//// <summary>
InBlock.gif 
/// PersonRecord is the Concrete Prototype
ExpandedBlockEnd.gif 
/// </summary>

None.gif public class PersonRecord : Record
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif    
string name;
InBlock.gif    
int age;
InBlock.gif 
InBlock.gif    
public override Record Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif       
return (Record)this.MemberwiseClone(); // default shallow copy
ExpandedSubBlockEnd.gif
    }

ExpandedBlockEnd.gif }

None.gif 
ExpandedBlockStart.gifContractedBlock.gif 
/**//// <summary>
InBlock.gif 
/// CarRecord is another Concrete Prototype
ExpandedBlockEnd.gif 
/// </summary>

None.gif public class CarRecord : Record
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif    
string carname;
InBlock.gif    Guid id;
InBlock.gif 
InBlock.gif    
public override Record Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif       CarRecord clone 
= (CarRecord)this.MemberwiseClone(); // default shallow copy
InBlock.gif
       clone.id = Guid.NewGuid(); // always generate new id
InBlock.gif
       return clone;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif }

None.gif 
ExpandedBlockStart.gifContractedBlock.gif 
/**//// <summary>
InBlock.gif 
/// RecordFactory is the client
ExpandedBlockEnd.gif 
/// </summary>

None.gif public class RecordFactory
ExpandedBlockStart.gifContractedBlock.gif 
dot.gif{
InBlock.gif    
private static Dictionary<RecordType, Record> _prototypes =
InBlock.gif       
new Dictionary<RecordType, Record>();
InBlock.gif 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// Constructor
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public RecordFactory()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif       _prototypes.Add(RecordType.Car, 
new CarRecord());
InBlock.gif       _prototypes.Add(RecordType.Person, 
new PersonRecord());
ExpandedSubBlockEnd.gif    }

InBlock.gif 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//// <summary>
InBlock.gif    
/// The Factory method
ExpandedSubBlockEnd.gif    
/// </summary>

InBlock.gif    public Record CreateRecord(RecordType type)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif       
return _prototypes[type].Clone();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值