static void Main(string[] args)
        {
            Console.WriteLine("                  Service    Operator    Circle    Provider     InComm  OutComm");
            Console.WriteLine("");
            ConcretePrototypeTopup CPT1 = new ConcretePrototypeTopup("Topup", "All", "Gujarat", "CyberPlat", new Commission(1.0, 0.5));

            Console.WriteLine("Original Object   {0}      {1}         {2}   {3}    {4}       {5} ", CPT1.Service, CPT1.Operator, CPT1.Circle, CPT1.Provider, CPT1.Comm.IncomingCommission, CPT1.Comm.OutgoingCommission);
            Console.WriteLine("");

            ConcretePrototypeTopup CPT2 = (ConcretePrototypeTopup)CPT1.Clone();

            Console.WriteLine("Deep Copy         {0}      {1}         {2}   {3}    {4}       {5}", CPT2.Service, CPT2.Operator, CPT2.Circle, CPT2.Provider, CPT2.Comm.IncomingCommission, CPT2.Comm.OutgoingCommission);
            Console.WriteLine("");

            CPT2.Circle   = "Telengana";
            CPT2.Provider = "Euronet";
            CPT2.Comm.IncomingCommission = 0.75;
            CPT2.Comm.OutgoingCommission = 0.25;

            Console.WriteLine("Change Deep       {0}      {1}         {2}   {3}    {4}       {5}", CPT2.Service, CPT2.Operator, CPT2.Circle, CPT2.Provider, CPT2.Comm.IncomingCommission, CPT2.Comm.OutgoingCommission);
            Console.WriteLine("");
            Console.WriteLine("Original Object   {0}      {1}         {2}   {3}    {4}       {5}", CPT1.Service, CPT1.Operator, CPT1.Circle, CPT1.Provider, CPT1.Comm.IncomingCommission, CPT1.Comm.OutgoingCommission);
            Console.WriteLine("");

            Console.ReadKey();
        }
        public override Prototype Clone()
        {
            ConcretePrototypeTopup objCPT = (ConcretePrototypeTopup)this.MemberwiseClone();

            //objCPT.Comm = (Commission)this.Comm.Clone();
            objCPT.Comm = new Commission(Comm.IncomingCommission, Comm.OutgoingCommission);
            objCPT.Comm.IncomingCommission = this.Comm.IncomingCommission;
            objCPT.Comm.OutgoingCommission = this.Comm.OutgoingCommission;
            return(objCPT);
        }