prototype 原型模型

原创 2013年12月03日 11:21:48

原型模式

前序

这回小菜准备去应聘了 , 大鸟看了小菜的简历后感觉他都是在瞎扯 . 小菜准备了很多份相同的简历 . 于是大鸟便让小菜同学通过编写代码来实现相同的三份简历 .

不久后小菜实现了第一版的代码 .

小菜的第一版代码

#include <stdio.h>

class Resume

{

public:

Resume(char* _name) : name(_name),sex(0),age(0),timeArea(0),company(0){}

void SetPersonalInfo(char* _sex,char* _age)

{

sex = _sex;

age = _age;

}

void SetWorkExperience(char* _timeArea,char* _company)

{

timeArea = _timeArea;

company = _company;

}

void Display()

{

printf("%s %s %s\n",name,sex,age);

printf(" 工作经历 :%s %s",timeArea,company);

}

protected:

char* name;

char* sex;

char* age;

char* timeArea;

char* company;

};

int main()

{

Resume a(" 大鸟 ");

a.SetPersonalInfo(" ","29");

a.SetWorkExperience("1998-2000","XX 公司 ");

Resume b(" 大鸟 ");

b.SetPersonalInfo(" ","29");

b.SetWorkExperience("1998-2000","XX 公司 ");

Resume c(" 大鸟 ");

c.SetPersonalInfo(" ","29");

c.SetWorkExperience("1998-2000","XX 公司 ");

a.Display();

b.Display();

c.Display();

return 0;

}

大鸟看后说到 :” 三份简历需要三次初始化 , 这样客户端的代码很麻烦 , 如果要二十份那就要二十次初始化 .”

小菜答到 :” 是的 . 如果写错了一个字那就要改二十次 .”

于是大鸟便叫小菜用原型模式重写了一遍代码 .

原型模式

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原型模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。

依赖关系的倒置

  抽象不应该依赖于实现细节,实现细节应该依赖于抽象。

(1)抽象A直接依赖于实现细节b(软件易脆,很容易需要重新编译)

 

(2)抽象A依赖于抽象B,实现细节b依赖于抽象B



动机(Motivation)

  在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接 口。如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改 变?

意图(Intent)

  使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象

                        ——《设计模式》GoF

 



在Spring中.深度科隆是应用广泛的。在实体模型上面有这样一个注解:@Component("lawsuitArchive") @scope("prototype"),表明在别的地方应用的时候,是引用其原型,同时Entity也要实现Cloneable接口和复写clone()方法。因为原型在初始化的时候就已经创建了一部分有价值的东西,减少容器的压力,而在别的地方,例如action中引用该对象的时候,直接可以使用@Resource(name="lawsuitArchive")引用对象,Spring会自动的装配好你想要的对象。

 

  • e75c84eb-a047-3799-a5a6-e3f88537d943-thumb.png
  • 大小: 8.4 KB
  • 00a457b4-10ef-3381-9208-d876afb0fcc4-thumb.png
  • 大小: 11.8 KB
  • f09bcd19-6169-3e84-8fc4-2421e672d271-thumb.png
  • 大小: 27.8 KB

Spring中原型prototype的准确使用

Spring中原型prototype的准确使用实际问题项目中,报表导出涉及到了在同一个类的两个不同方法中,都有相同的查询数据库的操作,一个方法是用于获取内容,一个是用于获取条数的,大概类似于这样:@S...
  • unifirst
  • unifirst
  • 2016年01月08日 17:04
  • 11568

JavaScript prototype原型和原型链详解

用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了,...
  • i10630226
  • i10630226
  • 2015年10月21日 14:25
  • 1566

js:深入prototype(下:原型重写)

//当属性和方法特别多时,编写起来不是很方便,可以通过json的格式来编写 //由于原型重写,而且没有通过Person.prototype来指定,此时的constructor不会再指向Person而是...
  • Magneto7
  • Magneto7
  • 2014年05月03日 16:02
  • 2615

封装--javascript的原型(prototype)

这里介绍一种基于组合的对象定义为了解决原型所带来的问题,需要通过组合构造函数和原型来实现对象的创建:将属性在构造函数中定义,将方法在原型中定义。这样有效结合了基于原型链和构造函数来定义对象的有点,是目...
  • Yana_li
  • Yana_li
  • 2016年10月10日 20:27
  • 574

JS中定义对象方式四: 使用原型(prototype)方式创建对象之一

function Person() {} Person.prototype.username = "zhangsan"; Person.prototype.password = "...
  • Geek_ymv
  • Geek_ymv
  • 2013年03月13日 11:13
  • 2352

JS----构造函数与原型prototype 区别

构造函数方法很好用,但是存在一个浪费内存 通过原型法分配的函数是所有对象共享的. 通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享...
  • damys
  • damys
  • 2015年07月22日 17:16
  • 2002

js中的prototype和基于prototype的继承总结

与其他编译语言的继承相比,javascript也有一套继承实现方式,即使用prototype原型及其链的方式。1、我们先用一个简单的例子先理解原型链, (http://img.blog.csdn.n...
  • houyaowei
  • houyaowei
  • 2016年05月18日 15:00
  • 240

自定义对象、prototype原型属性

一、自定义对象 1、在javascript没有类的概念,只要有函数即可创建对象。2、自定义对象的格式: 方式1: 使用无参的函数创建对象。 方式2:使用带参的函数创建对象。this表示当前对象。...
  • qq_34944851
  • qq_34944851
  • 2016年11月08日 13:35
  • 449

js对象中原型(prototype)的使用方法、替换以及注意事项

Title function Person(name, age, gender) { this.name = name; th...
  • gyq04551
  • gyq04551
  • 2017年06月22日 08:58
  • 252

js优化-prototype原型的使用

var builder = function (id) { this.init($(id)); this.forms = []; /* this.init = function (...
  • q646926099
  • q646926099
  • 2017年05月25日 14:32
  • 288
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:prototype 原型模型
举报原因:
原因补充:

(最多只允许输入30个字)