Proto Type Design Pattern

GOF -> A fully initialized instance to be copied or cloned. The Prototype pattern specifies the kind of objects to create using a prototypical instance.

So first create an object that allows copying himself to another object of same type, instead of creating new objects by using 'New' keyword.

  • Prototype co-opts one instance of a class for use as a breeder of all future instances.
  • Prototype is unique among the other creational patterns in that it doesn't require a class - only an object.
  • Prototypes are useful when object initialization is expensive
  • Factory Method creation through inheritance. Prototype creation through delegation
  • Prototype doesn't require sub classing, but it does require an "initialize" operation. Factory Method requires sub classing, but doesn't require Initialize.

    image1.gif

C# Support for the Proto type

A. Shallow Copy -> Object.MemberwiseClone Method

Any object that derives from the System.Object has this method, which creates a shallow copy of the current Object. The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object.

1. Value Type

When a field is a value type, a bit-by-bit copy of the field is performed.

2. Reference Type

When a field is a reference type, the reference is copied but the referred object is the same. So, the original object and its clone refer to the same object. For example, consider an object called SomePerson that references objects Person. A shallow copy of SomePerson creates new object SomePerson1 that also references objects Person.

Look at the following example

 public class A

                {

        private string _a;

        public A(string a){

 this._a = a;

        }

        public A Clone(){

            return (A)this.MemberwiseClone();

        }

}

On the client

image2.gif

Now consider another example

             public class SomeData{

        private int myVar;

        public int MyProperty

        {

            get { return myVar; }

            set { myVar = value; }

        }

    }

 

 

    public class A{

        private string _a;

        public SomeData MySomeData;

 

        public A(string a){

            this._a = a;

        }

 

        public A Clone(){

            return (A)this.MemberwiseClone();

        }
    }


Client side

image3.gif

B. Deep Copy -> Object.MemberwiseClone Method

As said above Deep copy is altogether different. It creates new objects. Following is the example code to implement deep copy.
 

                public class SomeData

    {

        private int myVar;

 

        public int MyProperty

        {

            get { return myVar; }

            set { myVar = value; }

        }

               

    }

 

 

    public class A

    {

        private string _a;

 

        public SomeData MySomeData;

 

        public A(string a)

        {

            this._a = a;

        }

 

        public A Clone()

        {

            return (A)this.MemberwiseClone();

        }

 

        public A DeepCopy()

        {

            A a = (A)this.MemberwiseClone();

            a.MySomeData = new SomeData();

            a.MySomeData.MyProperty = this.MySomeData.MyProperty;

 

            return a;

        }

    }


Client side code

image4.gif


Similar Articles