zoukankan      html  css  js  c++  java
  • 设计模式 原型模式

    Gof定义

    使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。

    动机

    在软件系统中,经常面临着“某些结构复杂的对象”的创建工作,但由于需求的变化,这些对象将成面临着剧烈的变化,但他们拥有比较稳定一致的接口。

    原型模式(Prototype)的几个要点

    • Prototype模式同样用于隔离类对象的使用者和具体类型(易变类型)之间的耦合关系,同样要求这些易变类型具有稳定的接口。
    • Prototype模式对于“如何创建易变类的实体对象”采用原型克隆的方法来做,他使得我们可以非常灵活的动态创建“拥有某些稳定接口”的新对象–所需工作仅仅是注册一个新类的对象(原型),然后在任何需要的地方不断地Clone。
    • Prototype模式中的克隆方法可以利用Net中的Object类的MemberwiseClone方法或是序列化来实现深拷贝。

    最基本的实现代码 (通过this.MemberwiseClose来实现拷贝)

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;<font color="#000000"></font>
    using System.Text;
    
    namespace 原型模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcreteProtypeA p1 = new ConcreteProtypeA("Demo");
                ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
                Console.WriteLine(p2.Id);
                Console.ReadLine();
            }
        }
    
        abstract class Prototype
        {
            private string id;
            public string Id
            {
                get { return id; }
                set { id = value; }
            }
    
            public Prototype(string id)
            {
                this.id = id;
            }
    
            public abstract Prototype Clone();
        }
    
        class ConcreteProtypeA : Prototype
        {
            public ConcreteProtypeA(string id)
                : base(id)
            { 
                
            }
    
            public override Prototype Clone()
            {
                return (Prototype)this.MemberwiseClone();
            }
        }
    
    }

    通过实现接口ICloneable来改进上面最基本的代码

    View Code
    namespace 原型模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                ConcreteProtypeA p1 = new ConcreteProtypeA("Demo");
                ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
                Console.WriteLine(p2.Id);
                Console.ReadLine();
            }
        }
    
    
        class ConcreteProtypeA : ICloneable
        {
    
            private string id;
            public string Id
            {
                get { return id; }
                set { id = value; }
            }
    
            public ConcreteProtypeA(string id)
            {
                this.id = id;
            }
    
            public object Clone()
            {
                return (object)this.MemberwiseClone();
            }
        }
    
    }

    自己写的一个简单例子:

    View Code
        class Program
        {
            static void Main(string[] args)
            {
                ConcreteProtypeA p1 = new ConcreteProtypeA();
                ConcreteProtypeA p2 = (ConcreteProtypeA)p1.Clone();
                Console.WriteLine(p2.name);
                p2.SayHello();
    
                Console.ReadLine();
            }
        }
    
        class ConcreteProtypeA : ICloneable
        {
            public string id = "1";
            public string name = "Jie";
    
            public void SayHello()
            {
                Console.WriteLine("Hi Jie");
            }
    
            public Object Clone()
            {
                return (Object)this.MemberwiseClone();
            }
        }

    大话设计模式里拷贝简历的例子(浅层拷贝,深层暂时不作了解)

    namespace 原型模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                Resume r = new Resume("大鸟");
                r.SetPersonInfo("", "29");
                r.SetWorkExperience("1909-2100", "微软公司");
                r.Display();
    
                Resume r2 = (Resume)r.Clone();
                r2.Display();
                r2.SetWorkExperience("2010-2011", "汕头公司");
                r2.Display();
    
                Console.ReadLine();
            }
        }
    
        class WorkExpreience
        {
            private string workDate;
            public string WorkDate
            {
                get { return workDate; }
                set { workDate = value; }
            }
    
            private string company;
            public string Company
            {
                get { return company; }
                set { company = value; }
            }
        }
    
        class Resume : ICloneable
        {
            private string name;
            private string sex;
            private string age;
            private string timeArea;
            private string company;
    
            public Resume(string name)
            {
                this.name = name;
            }
    
            public void SetPersonInfo(string sex, string age)
            {
                this.sex = sex;
                this.age = age;
            }
    
            public void SetWorkExperience(string timeArea, string company)
            {
                this.timeArea = timeArea;
                this.company = company;
            }
    
            public void Display()
            {
                Console.WriteLine("{0} {1} {2}", name, sex, age);
                Console.WriteLine("工作:{0} {1}", timeArea, company);
            }
    
    
            public object Clone()
            {
                return (object)this.MemberwiseClone();
            }
        }
    }
  • 相关阅读:
    asp.net core 集成JWT(一)
    Microsoft.Extensions.DependencyInjection中的Transient依赖注入关系,使用不当会造成内存泄漏
    Microsoft.Extensions.DependencyInjection的Singleton依赖注入关系,只是对于同一个ServiceProvider是单例的
    ASP.NET Core MVC中,如何将视图文件生成的html代码通过字符串返回
    SpringBoot魔法堂:说说带智能提示的spring-boot-starter
    Maven魔法堂:安装Oracle JDBC Driver依赖的那些坑
    TypeScript魔法堂:函数类型声明其实很复杂
    TypeScript魔法堂:枚举的超实用手册
    C#获取文件与文件夹默认图标(2006-3-22 新增示例代码与程序)
    【学习笔记】Team Explorer for Microsoft Visual Studio2015 安装时发生严重错误
  • 原文地址:https://www.cnblogs.com/cxeye/p/2667759.html
Copyright © 2011-2022 走看看