デザインモード--Prototypeモード


つまりプロトタイプモードです.既存のオブジェクトから新しいカスタマイズ可能なオブジェクトをクローンします.
 
JavaやC#を使うとこのプロセスは簡単です.Javaの各種類にはclone()メソッドがあり、C#にはclone()のほかにMemberwiseClone()メソッドがあります クローンに使用できます.
公式サイトの説明:
 
 
MemberwiseClone メソッドは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーする浅いテーブルコピーを作成します.フィールドが値タイプの場合、フィールドはビット単位でコピーされます.フィールドが参照タイプの場合、参照はコピーされますが、参照されたオブジェクトはコピーされません.したがって、元のオブジェクトとそのコピーは同じオブジェクトを参照します.
たとえば、オブジェクトAおよびBを参照するXというオブジェクトを考慮します.オブジェクトBはまた、オブジェクトCを参照する.Xの浅いテーブルのコピーは、オブジェクトAおよびBを参照する新しいオブジェクトX 2を作成します.これに対して、Xの深層コピーは、AおよびBのそれぞれのコピーである新しいオブジェクトA 2およびB 2を参照する新しいオブジェクトX 2を作成する.B 2はまた、新しいオブジェクトC 2を参照し、C 2はCのコピーである.実装の使用  ICloneable  インタフェースのクラスは、オブジェクトの浅いテーブルまたは深いレプリケーションを実行します.
 
(深いコピーと浅いコピーの違いについてはブログで詳しく書きます)
 
このモードは、クラスオブジェクトの使用者と特定のタイプ(可変クラス)との結合関係を主に分離するために使用される前のモードよりも複雑です.の以下はやはり例を通して学びます.これはKiddLeeのブログから中継されたものです.このコードはC#で書かれています.
//               ,        ,              。         ,        :1、 :  ,  ,  ;2 :     ;3  :    ,  ,  (      )。         。
//            ,       ,AbstractDriver,      (Man)   (Women)
public abstract class AbstractDriver
    {
        public AbstractDriver()
        {
            //
            // TODO:            
            //
        }
 
        public string name;
        public string sex;
        public int age;
 
        public abstract string drive();
 
        public abstract AbstractDriver Clone();
    }
 
    public class Man:AbstractDriver
    {
        public Man(string strName,int intAge)
        {
            sex = "Male";
            name = strName;
            age = intAge;
        }
 
        public override string drive()
        {
            return name + " is drive";
        }
 
        public override AbstractDriver Clone()
        {
            return (AbstractDriver)this.MemberwiseClone();
        }
    }
 
    public class Women:AbstractDriver
    {
        public Women(string strName,int intAge)
        {
            sex = "Female";
            name = strName;
            age = intAge;
        }
 
        public override string drive()
        {
            return name + " is drive";
        }
 
        public override AbstractDriver Clone()
        {
            return (AbstractDriver)this.MemberwiseClone();
        }
    }
//      :        Clone   ,                  ,                        。
//                   
//        :
public abstract class AbstractRoad
    {
        public AbstractRoad()
        {
            //
            // TODO:            
            //
        }
 
        public string Type;
        public string RoadName;
        public int RoadLong;
 
        public abstract AbstractRoad Clone();
    }
 
    public class Bituminous:AbstractRoad    //   
    {
        public Bituminous(string strName,int intLong)
        {
            RoadName = strName;
            RoadLong = intLong;
            Type = "Bituminous";
        }
 
        public override AbstractRoad Clone()
        {
            return (AbstractRoad)this.MemberwiseClone();
        }
    }
 
    public class Cement:AbstractRoad        //   
    {
        public Cement(string strName,int intLong)
        {
            RoadName = strName;
            RoadLong = intLong;
            Type = "Cement";
        }
 
        public override AbstractRoad Clone()
        {
            return (AbstractRoad)this.MemberwiseClone();
        }
    }
   
//      :
    public abstract class AbstractCar
    {
        public AbstractCar()
        {
            //
            // TODO:            
            //
        }
 
        public string OilBox;
        public string Wheel;
        public string Body;
 
        public abstract string Run();
        public abstract string Stop();
 
        public abstract AbstractCar Clone();
    }
 
    public class BMWCar:AbstractCar
    {
        public BMWCar()
        {
            OilBox = "BMW's OilBox";
            Wheel = "BMW's Wheel";
            Body = "BMW's body";
        }
 
        public override string Run()
        {
            return "BMW is running";
        }
 
        public override string Stop()
        {
            return "BMW is stoped";
        }
 
        public override AbstractCar Clone()
        {
            return (AbstractCar)this.MemberwiseClone();
        }
    }
 
    public class BORACar:AbstractCar
    {
        public BORACar()
        {
            OilBox = "BORA's OilBox";
            Wheel = "BORA's Wheel";
            Body = "BORA's Body";
        }
 
        public override string Run()
        {
            return "BORA is running";
        }
 
        public override string Stop()
        {
            return "BORA is stoped";
        }
 
        public override AbstractCar Clone()
        {
            return (AbstractCar)this.MemberwiseClone();
        }
    }
 
    public class VolvoCar:AbstractCar
    {
        public VolvoCar()
        {
            OilBox = "Volvo's OilBox";
            Wheel = "Volvo's Wheel";
            Body = "Volvo's Body";
        }
 
        public override string Run()
        {
            return "Volvo is running";
        }
 
        public override string Stop()
        {
            return "Volvo is stoped";
        }
 
        public override AbstractCar Clone()
        {
            return (AbstractCar)this.MemberwiseClone();
        }
    }
//              ,      Manage ,          ,        ,      :
class Manage
    {
        public AbstractCar Car;
        public AbstractDriver Driver;
        public AbstractRoad Road;
 
        public void Run(AbstractCar car,AbstractDriver driver,AbstractRoad road)
        {
            Car = car.Clone();
            Driver = driver.Clone();
            Road = road.Clone();
        }
    }
//        ,      ,                  。              ,        Volvo ,   “Anli”    ,    “Road1”、 1000     。
        static void Main(string[] args)
        {
            Manage game = new Manage();
            game.Run(new VolvoCar(),new Women("Anli",18),new Bituminous("Road1",1000));
            Console.Write("CarRun:" + game.Car.Run() + "
"); Console.Write("DriverName:" + game.Driver.name + "
"); Console.Write("DriverSex:" + game.Driver.sex + "
"); Console.Write("RoadName:" + game.Road.RoadName + "
"); Console.Write("RoadType:" + game.Road.Type + "
"); Console.Write("CarStop:" + game.Car.Stop() + "
"); Console.Read(); }

          :
    CarRun:Volvo is running
DriverName:Anli
DriverSex:Female
RoadName:Road1
RoadType:Bituminous
CarStop:Volvo is stoped
 
        BORA ,  (kid-li) ,        ,      Main   Run   。
game.Run(new BORACar(),new Man("kid-li",24),new Cement("Road1",1000));
     :
CarRun:BORA is running
DriverName:kid-li
DriverSex:Male
RoadName:Road1
RoadType:Cement
CarStop:BORA is stoped
  ,       ,           。