面向对象的理解

一、为什么要面向对象?

    (引用百度百科

    面向对象是在结构化设计方法出现很多问题的情况下应运而生的。结构化设计方法求解问题的基本策略是从功能的角度审视问题域。它将应用程序看成实现某些特定任务的功能模块,其中子过程是实现某项具体操作的底层功能模块。在每个功能模块中,用数据结构描述待处理数据的组织形式,用算法描述具体的操作过程。面对日趋复杂的应用系统,这种开发思路在下面几个方面逐渐暴露了一些弱点。

1.审视问题域的视角

在现实世界中存在的客体是问题域中的主角,所谓客体是指客观存在的对象实体和主观抽象的概念,他是人类观察问题和解决问题的主要目标。例如,对于一个学校学生管理系统来说,无论是简单还是复杂,始终是围绕学生和老师这两个客体实施。在自然界,每个客体都具有一些属性和行为,例如学生有学号、姓名、性别等属性,以及上课、考试、做实验等行为。因此,每个个体都可以用属性和行为来描述。

通常人类观察问题的视角是这些客体,客体的属性反应客体在某一时刻的状态,客体的行为反映客体能从事的操作。这些操作附在客体之上并能用来设置、改变和获取客体的状态。任何问题域都有一系列的客体,因此解决问题的基本方式是让这些客体之间相互驱动、相互作用,最终使每个客体按照设计者的意愿改变其属性状态。

结构化设计方法所采用的设计思路不是将客体作为一个整体,而是将依附于客体之上的行为抽取出来,以功能为目标来设计构造应用系统。这种做法导致在进行程序设计的时候,不得不将客体所构成的现实世界映射到由功能模块组成的解空间中,这种变换过程,不仅增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路。另外,再仔细思考会发现,在任何一个问题域中,客体是稳定的,而行为是不稳定的。例如,不管是国家图书馆,还是学校图书馆,还是国际图书馆,都会含有图书这个客体,但管理图书的方法可能是截然不同的。结构化设计方法将审视问题的视角定位于不稳定的操作之上,并将描述客体的属性和行为分开,使得应用程序的日后维护和扩展相当困难,甚至一个微小的变动,都会波及到整个系统。面对问题规模的日趋扩大、环境的日趋复杂、需求变化的日趋加快,将利用计算机解决问题的基本方法统一到人类解决问题的习惯方法之上,彻底改变软件设计方法与人类解决问题的常规方式扭曲的现象迫在眉睫,这是提出面向对象的首要原因。

2.抽象级别

抽象是人类解决问题的基本法宝。良好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性。抽象主要包括过程抽象和数据抽象。结构化设计方法应用的是过程抽象。所谓过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待。这种抽象级别对于软件系统结构的设计显得有些武断,并且稳定性差,导致很难准确无误地设计出系统的每一个操作环节。一旦某个客体属性的表示方式发生了变化,就有可能牵扯到已有系统的很多部分。而数据抽象是较过程抽象更高级别的抽象方式,将描述客体的属性和行为绑定在一起,实现统一的抽象,从而达到对现实世界客体的真正模拟。

3.封装体

封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。该逻辑单元负责将所描述的属性隐藏起来,外界对客体内部属性的所有访问只能通过提供的用户接口实现。这样做既可以实现对客体属性的保护作用,又可以提高软件系统的可维护性。只要用户接口不改变,任何封装体内部的改变都不会对软件系统的其他部分造成影响。结构化设计方法没有做到客体的整体封装,只是封装了各个功能模块,而每个功能模块可以随意地对没有保护能力客体属性实施操作,并且由于描述属性的数据与行为被分割开来,所以一旦某个客体属性的表达方式发生了变化,或某个行为效果发生了改变,就有可能对整个系统产生影响。

4.可重用性

可重用性标识着软件产品的可复用能力,是衡量一个软件产品成功与否的重要标志。当今的软件开发行业,人们越来越追求开发更多的、更有通用性的可重用构件,从而使软件开发过程彻底改善,即从过去的语句级编写发展到现在的构件组装,从而提高软件开发效率,推动应用领域迅速扩展。然而,结构化程序设计方法的基本单位是模块,每个模块只是实现特定功能的过程描述,因此,它的可重用单位只能是模块。例如,在C语言编写程序时使用大量的标准函数。但对于今天的软件开发来说,这样的重用力度显得微不足道,而且当参与操作的某些数据类型发生变化时,就不能够再使用那些函数了。因此,渴望更大力度的可重用构件是如今应用领域对软件开发提出的新需求。

 

二、为什要用工厂模式?

  ①当然是解耦

  ②(个人理解)因为用的是面向对象的思想编程,对象A调用类B的一个方法,注意这里说的是“类”B,因为对象A只需要调用类B的一个方法,而不关心是“类B”的哪个对象,所对象A不管“类B”的对象是怎么创建的,他不关系这个创建过程,对象A只是需要“类B”的一个方法而已,就像你去剪头发,你不关心是哪个师傅剪的,你只关心他帮你剪了头发就行了,随便一个发型师都可以,所以这种情况可以使用工厂模式,这种情况我只需要调用方法,如果你还要我创建一个对象,然后再通过对象来调用哪个方法,那从理论上就有点多余了,试想下,我只是想调用某个方法而已,你却要我先创建个对象,那不是扯淡么!这时候可能有人说了,那我岂不是把所有方法都定义成静态方法岂不好了?!都不用创建对象就可以直接调用方法了。这时候可能就掉进了面向过程的思想了,这里可以参考以上说的面向对象的思想的起因以及好处,而且静态方法只能使用静态变量,静态变量是在程序初始化的时候就要把静态的全部初始化的,这样很耗内存,损耗性能。当然一定的情况下,如果不关心对象,而只是关心类方法的时候,可以直接将方法定义成一个静态方法,静态方法就可以直接调用了,但是静态方法在多线程的时候很容易出问题,一定要注意,考虑到重用性以及安全性,因为不一定这个方法只有你自己在用,也许其他人也在调用这个方法,所以一般不使用静态方法,所以用工厂模式来弥补这种缺陷。但是有时候不能用工厂模式,就是在对象A是指定要“类B”的指定“对象b”来执行某个任务的时候,就不能使用工厂模式了,因为这里“对象A”不但关心“类B”的方法,而且指定要“对象b”去执行,那就不能随便用工厂制造一个对象了,就像同样的例子,你去剪头发的时候,你指定一个师傅帮你剪,也许你来这里剪了很多次了,知道哪个发型师剪得好看,所以你要指定一个师傅帮你剪,所以这时候不能是随便一个师傅都能帮你剪了,所以这时候不能使用工厂模式。

转载于:https://www.cnblogs.com/ismallboy/p/5745073.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值