首页 > 其他分享 >06_原型模式

06_原型模式

时间:2024-03-09 11:11:07浏览次数:17  
标签:Capacity iphone15 Battery 模式 iphone1 对象 原型 06 public

原型模式是一种创建型设计模式,它通过克隆现有对象来创建新对象,而不是通过实例化类来创建。原型模式允许我们创建具有相同属性和方法的对象集合,从而减少了对象的创建成本。

在原型模式中,我们首先创建一个原始对象,然后通过克隆该对象来创建新的对象。这样,我们可以在不重新实例化类的情况下创建多个相似的对象。

原型模式适用于以下场景:

  1. 当一个系统需要创建大量相似对象时,使用原型模式可以提高性能。

  2. 当对象的创建成本比克隆成本高时,使用原型模式可以节省资源。

  3. 当一个对象需要配置大量属性时,使用原型模式可以简化对象的创建过程。

总结而言,原型模式通过克隆现有对象来创建新对象,减少了对象的创建成本,提高了系统的性能和效率。

 

/// <summary>
    /// 电池
    /// </summary>
    [Serializable]
    public class Battery
    {
        /// <summary>
        /// 容量
        /// </summary>
        public int Capacity { get; set; } = 0;
        /// <summary>
        /// 电压
        /// </summary>
        public double Voltage { get; set; } = 0;
        /// <summary>
        /// 功率
        /// </summary>
        public double Power { get; set; } = 0;
    }

手机对象接口

public interface IPhone
    {
        /// <summary>
        /// CPU
        /// </summary>
        string CPU { get; set; }
        /// <summary>
        /// 内存
        /// </summary>
        int Memory { get; set; }
        /// <summary>
        /// 电池
        /// </summary>
        Battery Battery { get; set; }

        void Write(string tag);
        /// <summary>
        /// 浅拷贝
        /// </summary>
        /// <returns></returns>
        IPhone Clone();
        /// <summary>
        /// 深拷贝
        /// </summary>
        /// <returns></returns>
        IPhone DeepClone();
    }

 

/// <summary>
    /// 序列化帮助类
    /// </summary>
    public class SerializableHelper
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="target"></param>
        /// <returns></returns>
        public string Serializable(object target)
        {
            using(MemoryStream stream= new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, target);
                return Convert.ToBase64String(stream.ToArray());
            }
        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="target"></param>
        /// <returns></returns>
        public T Derializable<T>(string target)
        {
            return (T)Derializable(target);
        }

        public object Derializable(string target)
        {
            byte[] array = Convert.FromBase64String(target);
            using(MemoryStream stream = new MemoryStream(array))
            {
                return new BinaryFormatter().Deserialize(stream);
            }
        }
    }

 

/// <summary>
    /// 苹果手机类
    /// </summary>
    [Serializable]
    public class ApplePhone : IPhone
    {
        public ApplePhone()
        {
            Battery = new Battery
            {
                Capacity = 5000,
                Power = 5,
                Voltage = 3.7
            };
        }
        /// <summary>
        /// CPU
        /// </summary>
        public string CPU { get; set; } = string.Empty;
        /// <summary>
        /// 内存
        /// </summary>
        public int Memory { get; set; } = 0;
        /// <summary>
        /// 电池
        /// </summary>
        public Battery Battery { get; set; }

        /// <summary>
        /// 浅克隆
        /// </summary>
        /// <returns></returns>
        public IPhone Clone()
        {
            return this.MemberwiseClone() as ApplePhone;
        }

        /// <summary>
        /// 深克隆
        /// </summary>
        /// <returns></returns>
        public IPhone DeepClone()
        {
            SerializableHelper helper = new SerializableHelper();
            string target = helper.Serializable(this);
            return helper.Derializable<IPhone>(target);
        }

        public void Write(string tag)
        {
            Console.WriteLine($"{tag}=> CPU = {CPU},Memory = {Memory}");
        }
    }

浅克隆
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给新对象,如果是引用类型,在浅克隆中会复制一份引用类型的引用给新对象,也就是说新对象和原型对象的引用变量指向相同的内存地址。简单来说,浅克隆只会复制变量中直接存储的内容。

深克隆
深克隆中,如果原型对象的成员变量是值类型,将复制一份给新对象,如果是引用类型,深克隆会将引用变量指向内存区域中存储的实际数据复制一份给新对象,这时新对象的所有操作都不会对原型对象产生影响,真正意义上的全新的对象。

 

调用

public class Client
    {
        public void Start()
        {
            IPhone iphone1 = new ApplePhone();
            iphone1.CPU = "最初的三星S5L8900";
            iphone1.Memory = 1;
            iphone1.Write("iphone1");
            Console.WriteLine($"iphone1.Battery.Capacity={iphone1.Battery.Capacity} maA");

            IPhone iphone15 = iphone1.Clone();//浅拷贝
            iphone15.Write("iphone15");
            Console.WriteLine($"iphone15.Battery.Capacity={iphone15.Battery.Capacity} maA");

            //修改iphone15对象的内容
            iphone15.CPU = "芯片:A16仿生芯片,16核神经引擎,5核GPU、6核CPU";
            iphone15.Memory = 512;
            iphone15.Battery.Capacity++;

            iphone15.Write("iphone15修改后");
            iphone1.Write("iphone1");

            Console.WriteLine($"iphone15.Battery.Capacity={iphone15.Battery.Capacity} maA");
            Console.WriteLine($"iphone1.Battery.Capacity={iphone1.Battery.Capacity} maA");

            Console.WriteLine("---------------------漂亮的分割线------------------------");

            IPhone iphone16 = iphone1.DeepClone();//深拷贝
            iphone16.Write("iphone16");
            Console.WriteLine($"iphone16.Battery.Capacity={iphone16.Battery.Capacity} maA");

            iphone16.CPU = "12核CPU,10核GPU";
            iphone16.Memory = 1024;
            iphone16.Battery.Capacity++;

            iphone16.Write("iphone16修改后");
            iphone1.Write("iphone1");
            Console.WriteLine($"iphone16.Battery.Capacity={iphone16.Battery.Capacity} maA");
            Console.WriteLine($"iphone1.Battery.Capacity={iphone1.Battery.Capacity} maA");



        }
    }

 

static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

标签:Capacity,iphone15,Battery,模式,iphone1,对象,原型,06,public
From: https://www.cnblogs.com/MingQiu/p/18062405

相关文章

  • 05_建造者模式
    建造者模式是一种创建型设计模式,旨在让你能够创建复杂对象,而无需直接在应用程序中指定其具体类型。通过建造者模式,你可以将对象的构建过程和表示分离,从而使相同的构建过程可以创建不同表示形式的对象。这种模式通常包括以下几个关键组件:产品(Product):最终要创建的复杂对象。抽......
  • Go语言实现设计模式之命令模式
    摘要:命令模式是一种常用的设计模式,它将请求封装成对象,从而使请求的发送者和接收者解耦。本文将详细介绍命令模式的概念和原理,并使用Go语言实现一个示例,以帮助读者更好地理解该设计模式的应用。引言:在软件开发中,命令模式是一种常见的设计模式,它可以帮助我们将请求的发送者和接收......
  • Pod实现机制与设计模式
    每个Pod都有一个特殊的被称为"根容器"的Pause容器(Pause容器,又叫Infrastructure容器)。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器。 众所周知,容器之间是通过Namespace隔离的,Pod要想解决上述应用场景,那么......
  • MetaGPT day06 Environment组件源码 多智能体辩论
    Environment环境中通常具有一定的规则,而agent必须按照规则进行活动,MetaGPT提供了一个标准的环境组件Environment,来管理agent的活动与信息交流。MetaGPT源码中是这样介绍Environment的:环境,承载一批角色,角色可以向环境发布消息,可以被其他角色观察到Environment的基本组成:......
  • 原型模式解析
    本文是什么在前段时间学习了一些设计模式,里面的一些内容还是需要去值得思考的。其中有一种创建型模式叫做原型模式。在之前看的一些文章中,单例模式写的和拷贝构造函数差不多。但经过几天的思考,感觉还是和拷贝构造函数有着明显的区别,故写下此文表达我的想法。如果有不同的思考,可以......
  • 软件工程开发模式
    软件工程开发模式有多种,以下是一些常见的模式:瀑布模型(WaterfallModel):这是一种线性的软件开发过程,它按照一系列有序的阶段进行,每个阶段都有明确的任务和输出。在瀑布模型中,设计、需求分析、编码、测试和部署等阶段是顺序进行的,每个阶段完成后才能进入下一个阶段。迭代模型(Iter......
  • Axure Cloud如何给每个原型配置私有域名
    需求在原型发布之后,自动给原型生成一个独立访问的域名,类似http://u591bi.axshare.bushrose.cn,应该如何配置呢?准备事项已备案域名如何备案?阿里云备案流程已安装部署AxureCloud如何安装部署,请参考另外一篇文章,AxureCloud私有云最新版破解(AxureCloudforBusinessOn-P......
  • 04_抽象工厂模式
        抽象工厂模式是一种创建型设计模式,它提供一个接口用于创建一系列相关或相互依赖对象的工厂,而不需要指定具体的类。这种模式通过提供一个抽象的工厂接口,使得客户端可以创建一系列产品对象而无需关心具体的实现细节。    在抽象工厂模式中,通常会定义一个抽象工......
  • 03_工厂方法模式
    工厂方法模式是一种创建型设计模式,用于定义一个创建对象的接口,但将实际创建对象的工作延迟到子类中。这样可以使一个类的实例化延迟到其子类中,从而实现解耦和灵活性。在工厂方法模式中,通常包含以下几个角色:抽象工厂(Creator):定义创建对象的接口,通常包含一个抽象的工厂方法,由子类......
  • 02_简单工厂模式
    简单工厂模式(SimpleFactoryPattern)是一种创建型设计模式,属于工厂模式的一种。在简单工厂模式中,通过一个工厂类来负责创建对象实例,而客户端无需直接创建对象,只需要通过工厂类来获取所需的对象。简单工厂模式包含以下几个角色:工厂类(Factory):负责创建对象实例的类。产品类(Produc......