通过给出一个原型对象来指明所要创建的对象类型,然后用复制这个对象的办法创建更多的同类型对象
客户角色:客户类提供创建对象的请求。
抽象原型角色:这是一个抽象角色,通常由一个c#接口或抽象类实现,此角色给出所有的具体原型类所需的接口,在c#中抽象原型角色通常实现了ICioneable接口。
具体原型角色:被复制的对象,此角色需要实现抽象原型角色所需求的接口。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections.Generic;
using System.Text;
namespace Simple_Factory
{
/// <summary>
/// 抽象原型类
/// </summary>
abstract class ProtoType
{
private string id;
{
/// <summary>
/// 抽象原型类
/// </summary>
abstract class ProtoType
{
private string id;
public string Id
{
get
{
return id;
}
}
{
get
{
return id;
}
}
public ProtoType(string id)
{
this.id = id;
}
{
this.id = id;
}
abstract public ProtoType Clone();
}
}
/// <summary>
/// 具体原型类
/// </summary>
class ConcreatePrototype1 : ProtoType
{
public ConcreatePrototype1(string id) : base(id) { }
public override ProtoType Clone()
{
return (ProtoType)this.MemberwiseClone();
}
}
/// 具体原型类
/// </summary>
class ConcreatePrototype1 : ProtoType
{
public ConcreatePrototype1(string id) : base(id) { }
public override ProtoType Clone()
{
return (ProtoType)this.MemberwiseClone();
}
}
class ConcreatePrototype2:ProtoType
{
public ConcreatePrototype2(string id) : base(id) { }
{
public ConcreatePrototype2(string id) : base(id) { }
public override ProtoType Clone()
{
return (ProtoType)this.MemberwiseClone();
}
}
{
return (ProtoType)this.MemberwiseClone();
}
}
class Client
{
public static void Main(string[] args)
{
ConcreatePrototype1 p1 = new ConcreatePrototype1("I");
{
public static void Main(string[] args)
{
ConcreatePrototype1 p1 = new ConcreatePrototype1("I");
ConcreatePrototype1 c1 =(ConcreatePrototype1) p1.Clone();
Console.WriteLine("Clone:{0}",c1.Id);
}
}
}
}
}
}
优点:
允许动态增加或减少产品类,由于创建产品类实例的方法是产批类内部具有的,因此增加新产品对整个结构没有影响。
简化的创建结构,工厂方法模式常常需要有一个与产品类等级结构相同的等级结构。
具有给一个应用软件动态加载新功能的能力,由于原型模式的独立性比较高,可以很容易动态加载新功能而不影响老系统。
产品类不需要非得有任何事先确定的等级结构,因为原型模式适用于任何的等级结构。
缺点:
每个类必须配备一个克隆方法,而且这个克隆方法需要对类的功能进行通盘考虑,这对全新的类来说不是很难,但对已有的类进行改造时,不一定是件容易的事。