大话设计模式-原型模式


  前言

     我们在软件学习的时候接触到最多的是复用,不仅能节省大量的人力物力,还能减少系统的复杂程度。在实现软件功能的过程中,当创建多个

复杂类的实例,要是非得用NEW操作符去实现这样的类实力,但是在一定程度上增加了创建类的复杂程度而且会占用大量的内存,很多这样的类实例

对象不断增加,系统的复杂度将变得很高,因此需要寻找合适的模式来解决这个问题。每个实例是相同的,当我们需要多个相同的类实例,就没必

要一次次的用new去创建这些相同的类实例对象。最先想到的就是能服用哪些就好了,我们只创建一个类实例对象,如果后面有需要的话,可以通过

对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用。 然而这个思路正是原型

模式的实现方式。下面就具体介绍下设计模式中的原型设计模式。


  原型模式:

     1 创建型模式中一个比较特殊的模式-原型模式,这个模式呢,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,一种是是浅复

制,另一种是深复制,这里我们也会探讨下深复制和浅复制的原理,这样可能更方便大家理解这个原型模式的使用。我们都知道,创建型模式一般

用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作

就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。


     2原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。


     3结构图:原型模式其实就是从一个队形在创建另一个可定制的对象,而且不需知道任何创建的细节。

             

     4代码部分

     简历的基本实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 原型1
{
    class Resume// 

    {
        private string name;
        private string sex;
        private string age;
        private string timeArea;
        private string company;
        public Resume(string name)
        {
            this.name=name;
        }
        //设置个人信息
        public void SetPersonalInfo(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);

        }
        static void Main(string[] args)
        {
            Resume a = new Resume("大鸟");
           a .SetPersonalInfo ("男","29");
           a.SetWorkExperience("1998-2000", "XX公司");

           Resume b = new Resume("大鸟");
           b.SetPersonalInfo("男", "29");
           b.SetWorkExperience("1998-2000", "XX公司");

           Resume c = new Resume("大鸟");
           c.SetPersonalInfo("男", "29");
           c.SetWorkExperience("1998-2000", "XX公司");

           a.Display();
           b.Display();
           c.Display();



           Console.Read();

        }
    }
}

     浅复制和深复制

     深复制-不管是值类型的成员还是引用类型的成员,这样的对象和对象副本,对任何一个成员属性的修改,都不会影响到改变对象的
     浅复制-对象和对象副本共用同一个引用对象,那么不管是在对象还是对象副本中修改了相应的引用成员了之后,那么这个引用类型的成员就会发生变化

    

class WorkExperience//工作检验类
    {
        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 WorkExperience work;
            public Resume(string name)
            {
                this.name = name;
                work=new WorkExperience ();
            }
            //设置和人信息
            public void SetPersonalInfo(string sex,string age)
            {
                this.sex = sex;
                this.age = age;

            }
            
            //设置工作经验
            public void SetWorkExperience(string workDate, string company)
            {
                work.workDate = workDate;
                work.company = company;

            }
            //显示
            public void Display()
        {
            Console.WriteLine("{0} {1} {2}", name, sex, age);
            Console.WriteLine("工作经验:{0}{1}", work.workDate, work.company);

        }
            public Object Clone()
            {
                return (object)this.MemberwiseClone();
            }
    总结:

       它与工厂方法模式的实现非常相似,其中原型模式中的Clone方法就类似工厂方法模式中的工厂方法,只是工厂方法模式的工厂方法是通过new运算符重新创建一个新的对象(相当于原型模式的深拷贝实现),而原型模式是通过调用MemberwiseClone方法来对原来对象进行拷贝。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值