极速理解设计模式系列:4.原型模式(Prototype Pattern)

简介:

四个角色:抽象原型角色(Prototype)、具体原型角色(ConcretePrototype)、原型管理器角色(PrototypeManager)、客户端角色(Client)

        抽象原型角色(Prototype):定义原型的克隆方法接口

        具体原型角色(ConcretePrototype):实现原型具体的克隆方法

        原型管理器角色(PrototypeManager):负责具体原型的增、删、查和原型容器。

        客户端角色(Client):实例化多个原型、并且通过原型的克隆接口克隆多个子对象。

实现思路:首先实例化多个原型A、B、C、D,然后在客户端调用A原型的Clone接口即可获取到A原型的克隆子对象,并且可以重新设置这个克隆子对象的值。

 类图:

应用场景:在Silverlight中的制作一个绘制工程图的工具箱,里面可以有很多直线选择器、圆形选择器、矩形选择器,我们点一次这个工具箱中得选择器,则绘制一个相应的图。

分析:如果要绘制上万个圆形,不可能去实例一万个圆形对象,在这里我们使用原型模式,设置好默认的原型属性,每次拖动的时候,实际上通过其原型类浅拷贝一个副本对象即可。

        下面我们在控制台程序去演示一下如何使用Prototype Pattern:

        一、抽象原型角色(Prototype)

复制代码
    //抽象原型角色:Prototype
abstract class DrawPrototype
{
//需要绘制的图形名称、高和宽
public string DrawName{get;set;}

public double Height { get; set; }

public double Width { get; set; }

/// <summary>
/// 对原型进行克隆
/// </summary>
/// <returns></returns>
public abstract DrawPrototype DrawClone();
}
复制代码

        二、具体原型角色(ConcretePrototype)

复制代码
   //具体原型角色:ConcretePrototype
class ConcreteDrawing : DrawPrototype
{
/// <summary>
/// 实现原型模式的自我浅拷贝
/// </summary>
/// <returns></returns>
public override DrawPrototype DrawClone()
{
return (DrawPrototype)this.MemberwiseClone();
}

/// <summary>
/// 显示自身特性
/// </summary>
public void ShowInfo()
{
Console.WriteLine(DrawName
+ " " + Height.ToString() + " " + Width.ToString());
}
}
复制代码

        三、原型管理器角色(PrototypeManager)

复制代码
    //原型管理器
class DrawManager
{
//原型库
List<ConcreteDrawing> drawingList = new List<ConcreteDrawing>();

//添加原型到原型库
public void AddDrawing(DrawPrototype cdraw)
{
drawingList.Add(cdraw);
}

//获取到对应名字的原型以供克隆副本
public ConcreteDrawing GetDrawing(string drawName)
{
return drawingList.FirstOrDefault(x => x.DrawName == drawName);
}
}
复制代码

        四、客户端角色(Client)

复制代码
    //客户端:Client
class Program
{
static void Main(string[] args)
{
//初始化绘画管理工具
DrawManager drawManager = new DrawManager();
//初始化矩形、圆形、梯形、直线的原型实体以供后面拖出来使用
drawManager.AddDrawing(new ConcreteDrawing() { DrawName = "Rectangle", Width = 100, Height = 100 });
drawManager.AddDrawing(
new ConcreteDrawing() { DrawName = "Round", Width = 80, Height = 80 });
drawManager.AddDrawing(
new ConcreteDrawing() { DrawName = "Trapezoidal", Width = 50, Height = 50 });
drawManager.AddDrawing(
new ConcreteDrawing() { DrawName = "Line", Width = 100, Height = 1 });

//调用原型的Clone方法获取浅拷贝对象
ConcreteDrawing rect1 = (ConcreteDrawing)drawManager.GetDrawing("Rectangle").DrawClone();
rect1.Height
= 197;
rect1.ShowInfo();
ConcreteDrawing rect2
= (ConcreteDrawing)drawManager.GetDrawing("Rectangle").DrawClone();
rect2.Width
= 112;
rect2.ShowInfo();
ConcreteDrawing rect3
= (ConcreteDrawing)drawManager.GetDrawing("Rectangle").DrawClone();
rect3.ShowInfo();

ConcreteDrawing line
= (ConcreteDrawing)drawManager.GetDrawing("Line").DrawClone();
line.ShowInfo();

Console.ReadLine();
}
}
复制代码

        如需源码请点击 PrototypePattern.rar 下载。




本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2011/08/30/2155568.html,如需转载请自行联系原作者


相关文章
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
3月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
3月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
5月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
5月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
53 6
|
6月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
6月前
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
6月前
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
|
7月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)