面向对象的几种设计模式

 1.面向对象的概念

其实面向对象是相对于面向过程而言,通俗来说就是创建对象,每个对象有自身的属性和方法,对象.属性  对象.方法 实际上这已经是一个面向对象的过程了,面向过程,是指执行一件事的流程,一步接着一步进行,举个例子来说,比如你去烧菜,面向过程的执行就是,你先要去买菜,然后你要去洗菜,然后烧菜等一系列具体的步骤,而对于面向对象而言,把你当做一个对象,买菜是一个对象,烧菜也是一个对象,你首先会传递消息,你要用菜,菜才就会出现,至于菜是怎么来的,买的还是偷得,那就不需要你知道.......等你洗好会菜会发送消息表明现在要烧菜,菜就会烧好,至于菜是如何烧的,过程如何,你也不需要知道,其实面向过程会细究每一步的执行过程,而面向对象不会细究。

----例子有点不恰当,面向对象的概念本身十分的抽象,只能慢慢体会

2 面向对象的设计模式

一.普通模式

   普通模式比较繁琐,一个对象一个实例,

       普通创建对象的方法,缺陷:

  • 如果创建多个对象会比较繁琐,效率低
  • 实例与原型之间,没有任何办法,可以看出有什么联系。

例如:

      var  people=new Object();

    people.name="张三";

    peoole.food="苹果";

    people.eat=function(){

    alert(this.name+"喜欢吃"+this.food)

    }

       people.eat())//张三喜欢吃苹果

  var  people1=new Object();

    people1.name="李四";

    peoole1.food="香蕉";

    people1.eat=function(){

    alert(this.name+"喜欢吃"+this.food)

    }

      people1.eat()//李四喜欢吃香蕉

//若有100个对象,则需要创建100次,不利于实际的开发

 

二 工厂模式

这种模式比较简单,其实就是在函数中创建一个对象,给对象添加属性及其属性值或属性方法然后在讲这个对象用return返回出来(return 是关键)

  • 创建过程类似于工厂生产产品的过程,即:原材料--加工--产品...
  • 解决了多次重复创建多个对象的麻烦。
  • 问题:
    • 创建出的实例之间没有内在的联系,不能反映出它们是同一个原型对象的实例。
    • 创建对象的时候没有使用 new 关键字
    • 会造成资源浪费,因为每生成一个实例,都增加一个重复的内容,多占用一些内存。

 

function create(name,food){

    var people=new Object()   //原材料;

    people.name=nane

    people.food=food

    people.eat=function(){

     alert(this.name+"喜欢吃"+this.food)

  }//加工过程

  return people;//产品

}

var people 1=create("小丸子",“海鲜”);//不用new关键字创建

var people2=create("小李","红烧肉");

     people1.eat()

     people2.eat()

//这种模式的缺点就是内存消耗大

people1==people2   //false,占用不同的内存空间

注意:上面提到一定工厂模式一定要有返回值

如果没有返回,则返回错误如下

三. 构造函数模式

  1. new 调用的函数为构造函数,构造函数和普通函数区别仅仅在于是否使用了new来调用。
  2. 所谓“构造函数”,就是专门用来生成“对象”的函数。它提供模板,作为对象的基本结构。
  3. 构造函数内部使用了this变量。对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。
  4. instanceof 验证原型对象与实例对象之间的关系。
  5. 使用call和apply方法实现对象的冒充
  6. 问题:浪费内存--使用构造函数每生成一个实例,都增加一个重复的内容,多占用一些内存。这样既不环保,也缺乏效率

       new关键字能改变this的作用域

     关键采用this关键字,对于this的理解,见ttps://www.cnblogs.com/yanhaijing/p/3685309.html(比较厉害的大牛)

    function  People(name,food){ //构造函数名首字母要大写,小写不会错,但习惯大写

         this.name=name ;

         this.food=food;

         this.eat=function(){

         alert(this.name+"喜欢吃"+this.food)//此处this指的是windows对象

     }

   }  

  var people1=new people("张三","苹果");

  var people2=new people("李四","香蕉");

  people1.eat()

people1==people2   //false  占用不同的内存空间

小总结:首先函数名首字母应该大写

              与工厂模式不同的是,不需要在函数内部使用关键字new,两者相同的是都消耗很多内存

              new关键字会改变this的作用域。this为当前调用的对象

              创建完成构造函数后需要new一个实例化的对象赋值给一个变量,然后可以通过这个变量来调用构造函数里面的属性以及方法

           构造函数模式可以传递参数

四 原型构造模式

构造函数都会有一个prototype(原型)属性,这个属性其实就是一个指针,它指向了一个对象,在这个对象里包含了可以共享给实例化对象的所有属性及方法

1.第一种写法

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信