`
lingyibin
  • 浏览: 196379 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

设计模式--Prototype模式

阅读更多

也就是原型模式。它是通过已经存在的对象来克隆出一个新的可定制的对象。

 

如果是用Java或C#的话这个过程会简单一点,因为Java的各种类中都有一个clone() 方法,C#中除了clone() 外还有一个MemberwiseClone()方法 可以用来克隆。

官网上说明:

 

 

MemberwiseClone 方法创建一个浅表副本,方法是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象。

例如,考虑一个名为 X 的对象,该对象引用对象 A 和 B。对象 B 又引用对象 C。X 的浅表副本创建一个新对象 X2,该对象也引用对象 A 和 B。与此相对照,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2 和 B2,它们分别是 A 和 B 的副本。B2 又引用新对象 C2,C2 是 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() + "\n");
            Console.Write("DriverName:" + game.Driver.name + "\n");
            Console.Write("DriverSex:" + game.Driver.sex + "\n");
            Console.Write("RoadName:" + game.Road.RoadName + "\n");
            Console.Write("RoadType:" + game.Road.Type + "\n");
            Console.Write("CarStop:" + game.Car.Stop() + "\n");
            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
这样,经过简单的更改,可以实现实现细节的变化。
 
分享到:
评论

相关推荐

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    C#设计模式-吕震宇

    C#设计模式(9)-Prototype Pattern C#设计模式(8)-Builder Pattern C#设计模式(7)-Singleton Pattern C#设计模式(6)-Abstract Factory Pattern C#设计模式(5)-Factory Method Pattern C#设计模式(4)...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴...│ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建型设计模式-Prototype原型设计模式实战《下》.mp4 │ 6.1-接口之间的桥梁-适配器设计模式你知道多少.mp4 │ 6.4

    23种 设计模式---面向对象的基本原则

    设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,为软件开发提供了可复用的解决方案。在面向对象编程中,设计模式基于一些基本原则,这些原则构成了良好设计的基础。本篇将深入探讨23种设计...

    Java 中的设计模式 - jdon

    《Java中的设计模式 - jdon》是一本深入探讨Java编程中设计模式的电子书,它主要聚焦于如何在实际开发中应用和理解这些经典的设计原则和模式。设计模式是软件工程中的一种最佳实践,它总结了在特定上下文中解决常见...

    设计模式-可复用面向对象软件的基础

    《设计模式-可复用面向对象软件的基础》这本书是面向对象编程领域中的一部经典之作。设计模式,作为软件工程中的重要概念,是解决常见问题的成熟解决方案的模板,它在实践中被反复验证并广泛接受。这本书深入浅出地...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    - **Prototype模式**:通过克隆已有的实例来创建新对象,而不是通过创建新的实例。 #### 2. 结构型模式 - **Bridge模式**:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 - **Adapter模式**:将一个类...

    设计模式--java版.rar

    本资源“设计模式--java版.rar”提供了一种深入理解和应用Java设计模式的方式。 在Java开发中,设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例(Singleton)、工厂方法(Factory ...

    设计模式 -- 模仿女娲造物(入门)

    压缩包中的文件名为“ren”,这可能代表了某种与人类或者角色相关的例子,作者可能用这个例子来演示如何使用设计模式来创建和管理软件对象,如使用原型模式(Prototype)创建对象的克隆,或者使用职责链模式(Chain...

    设计模式精解-GoF 23种设计模式解析附C++实现源码

    5. **Prototype模式** - **定义**:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 - **应用场景**:当一个类的实例只能有几个不同状态组合中的一种时使用。 - **优点**:可以通过克隆已有...

    Python编程 -设计模式-从入门到实践

    在编程领域,设计模式是一种被广泛接受的解决常见问题的最佳实践。它们是经过时间验证的、可重用的解决方案,可以提升代码的可读性、可维护性和复用性。当我们谈论“Python编程 - 设计模式 - 从入门到实践”时,这...

    设计模式-可复用面向对象软件的基础.rar

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式已经被广泛接受,并在面向对象编程中被广泛应用,以提高代码的可读性、可维护性和可复用性。《设计模式-可复用面向对象...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    ### GOF设计模式详解 #### 一、设计模式概述 **设计模式**(Design Patterns)是软件工程中的一个重要概念,它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。本章节将从多个角度对设计模式...

    JAVA设计模式-day2.pdf

    JAVA设计模式-day2,请的行业大能讲得课程,涉及:创建模式(5种: 1、 工厂方法模式(Factory Method); 2、 抽象工厂模式; 3、 单例模式(Singleton) • 4、 建造者模式(Builder); 5、 原型模式(Prototype...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)(0520_).rar

    《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者王翔通过C#语言来阐述各种设计模式的原理、应用及其在实际工程中的扩展。这本书对于C#开发者来说,是提升软件设计能力的重要参考资料...

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    在本设计模式课程设计中,我们重点探讨了五个核心的设计模式:原型模式、单例模式、抽象工厂模式、代理模式和建造者模式。这些模式在Java编程中具有广泛的应用,能够帮助开发者创建更加灵活、可扩展和易于维护的代码...

Global site tag (gtag.js) - Google Analytics