当前位置 : 主页 > 网络编程 > net编程 >

创建型模式-原型模式

来源:互联网 收集:自由互联 发布时间:2023-10-08
原型模式描述 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式 使用场景 如果你需要复

原型模式描述

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

使用场景

  1. 如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
  2. 如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。

工作原理

通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它。

使用方法

1.首先定义一个抽象原型。

namespace ColoPropty.ColorProp
{
    public abstract class ColorPrototype //抽象原型
    {
        public abstract ColorPrototype Clone();  //抽象方法
    }
}

2.定义一个具体的类

namespace ColoPropty.ColorProp
{
    //具体原型
    class Color : ColorPrototype
    {
        private int red, green, blue;
        public Color(int red, int green, int blue)
        {
            this.red = red;
            this.green = green;
            this.blue = blue;
        }
        /// <summary>
        ///  重写抽象方法
        /// </summary>
        /// <remarks>
        ///  <b>MemberwiseClone</b> 方法创建一个浅拷贝,具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。
        /// </remarks>
         public override ColorPrototype Clone()  
        {
            return this.MemberwiseClone() as ColorPrototype; 
        }
        public void Display()  //在页面上显示对应的颜色
        {
            Console.WriteLine("RGB values are: {0},{1},{2}",         //输出对应的颜色
            red, green, blue);
        }
    }
}

3.定义管理类

namespace ColoPropty.ColorProp
{
    class ColorManager
    {
        Hashtable colors = new Hashtable();   //定义键值对变量
        public ColorPrototype this[string name]   //定义原型变量
        {
            get { return colors[name] as ColorPrototype; }
            set { colors.Add(name, value); }
        }
    }
}

4.实现

using System;
using System.Threading;
using System.Threading.Tasks;
 
namespace ConsoleApp3
{
    class Program
    {
        static void Main(string[] args)
        {
            ColorManager colormanager = new ColorManager();
            //初始化颜色的值
            colormanager["red"] = new Color(255, 0, 0);
            colormanager["green"] = new Color(0, 255, 0);
            colormanager["blue"] = new Color(0, 0, 255);
            //增加个性化颜色
            colormanager["angry"] = new Color(255, 54, 0);
            colormanager["peace"] = new Color(128, 211, 128);
            colormanager["flame"] = new Color(211, 34, 20);
            // 用户使用颜色
            string colorName = "red";
            Color c1 = (Color)colormanager[colorName].Clone();
            c1.Display();
            colorName = "peace";
            Color c2 = (Color)colormanager[colorName].Clone();
            c2.Display();
            colorName = "flame";
            Color c3 = (Color)colormanager[colorName].Clone();
            c3.Display();
            Console.WriteLine("结束");
        }
    }
}

浅拷贝:只复制对象的基本类型、对象类型、仍然属于原引用,也称为“影子克隆”,引用地址不变;

深拷贝:不止复制对象的基本类,同时也复制原对象中的对象,说完全是就是新对象产生的,也称为“深度克隆”,引用地址变化,就是同一个对象;

我们可以根据实际情况来判断使用深拷贝还是浅拷贝

上一篇:J2ME UI之窗口部件背景
下一篇:没有了
网友评论