c#设计模式-创建性模式-3.原型模式
Posted mr.chenyuelin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#设计模式-创建性模式-3.原型模式相关的知识,希望对你有一定的参考价值。
原型模式:当我们需要创建相同类的实例时,创建好一个实例后,其它的通过拷贝获取
就原型接口和具体原型类,具体原型类多写一个克隆方法而已
解决问题:当一个类的实例化过程很复杂或昂贵,反复new创建实例会增加创建类与客户端代码的耦合度,所以我们需要克隆
例子,孙悟空只要吹一下毛就可以变出很多猴子,可以一部分保护师傅,一部分战斗
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace 原型模式
{
public abstract class MonkeyType
{
//战斗-保护师傅
public abstract void Fight();
//化缘-搞吃的
public abstract void BegAims();
//克隆-吹一口,变一堆出来
public abstract MonkeyType Clone();
}
public sealed class XingZhenSunMonkeyType : MonkeyType
{
public override void BegAims()
{
Console.WriteLine("师傅饿了,搞点吃的");
}
//只负责与天上的神仙的战斗
public override void Fight()
{
Console.WriteLine("与神仙战斗,保护师傅");
}
public override MonkeyType Clone()
{
//浅拷贝,复制引用但不复制引用的对象
return (XingZhenSunMonkeyType)this.MemberwiseClone();//这里用深拷贝也可
}
}
public sealed class SunXingZhenMonkeyType : MonkeyType
{
public override void BegAims()
{
Console.WriteLine("师傅饿了,搞点吃的");
}
//只负责与妖战斗
public override void Fight()
{
Console.WriteLine("与妖战斗,保护师傅");
}
public override MonkeyType Clone()
{
//浅拷贝,复制引用但不复制引用的对象
return (SunXingZhenMonkeyType)this.MemberwiseClone();//这里用深拷贝也可
}
}
//深拷贝
[Serializable]
public class BaseClone<T>
{
public virtual T Clone()
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, this);//序列化
stream.Position = 0;
return (T)formatter.Deserialize(stream);//反序列
}
}
class Program
{
static void Main(string[] args)
{
MonkeyType xingZhenSun = new XingZhenSunMonkeyType();
MonkeyType xingZhenSun2 = xingZhenSun.Clone();
MonkeyType xingZhenSun3 = xingZhenSun.Clone();
xingZhenSun2.Fight();
xingZhenSun3.BegAims();
MonkeyType sunXingZhe = new SunXingZhenMonkeyType();
MonkeyType sunXingZhen2 = sunXingZhe.Clone();
MonkeyType sunXingZhen3 = sunXingZhe.Clone();
MonkeyType sunXingZhen4 = sunXingZhe.Clone();
sunXingZhen2.Fight();
sunXingZhen4.BegAims();
}
}
}
与神仙战斗,保护师傅
师傅饿了,搞点吃的
与妖战斗,保护师傅
师傅饿了,搞点吃的
一般与工厂方法搭配,原型模式克隆创建实例,工厂方法模式将实例提供给调用者
比如,都是福建工厂生产的鼠标,一些发给北京,一些发给上海,一些发给浙江
以上是关于c#设计模式-创建性模式-3.原型模式的主要内容,如果未能解决你的问题,请参考以下文章
C#设计模式:原型模式(Prototype Pattern)