依赖倒置:抽象不应该依赖于实现细节,实现细节应该依赖于抽象【软件分析—软件是动态的】
原型模式
意图
结构:结合例子看
例子:场景,游戏系统创建不同角色
1、抽象角色类
public abstract class WalkPer
{
public abstract WalkPer clone();
}
public abstract class FlyPer
{
public abstract FlyPer clone();
}
2、具体角色实现
public class WalkPerA : WalkPer
{
public override WalkPer clone()
{
return (WalkPer)this.MemberwiseClone();
}
}
public class WalkPerB : WalkPer
{
public override WalkPer clone()
{
return (WalkPer)this.MemberwiseClone();
}
}
public class FlyPerA : FlyPer
{
public override FlyPer clone()
{
return (FlyPer)this.MemberwiseClone();
}
}
public class FlyPerB : FlyPer
{
public override FlyPer clone()
{
return (FlyPer)this.MemberwiseClone();
}
}
MemberwiseClone:
按成员拷贝(浅拷贝:如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象,原始对象和其副本引用同一个对象!)
1、如果其成员为简单成员(值类型和string),这样没问题
2、如果是引用类型(例如数组)
深拷贝(深复制中原始对象和副本的引用类型指向各自的地址,两者完全是两个不同的对象):
序列化深拷贝,通用的深拷贝方法使用时必须为相关类及类的引用类型加上可序列化标识:[Serializable]
深拷贝例子代码
/// <summary>
/// 通用的深拷贝方法
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]//可序列化标识
public class BaseClone<T>
{
public virtual T Clone()
{
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(memoryStream, this);
memoryStream.Position = 0;
return (T)formatter.Deserialize(memoryStream);
}
}
3、游戏系统(不变)
public class GameSystem
{
public void Run(WalkPer walkPer,FlyPer flyPer)
{
WalkPer walk1 = walkPer.clone();
WalkPer walk2 = walkPer.clone();
FlyPer fly1 = flyPer.clone();
FlyPer fly2 = flyPer.clone();
}
}
4、调用
public static void Main(string[] args)
{
GameSystem gameSystem = new GameSystem();
gameSystem.Run(new WalkPerA(),new FlyPerB());
}
要点:
创建型模式小结: