日期:2014-05-20  浏览次数:20722 次

封装的意义和作用,以及工厂方法是什么意思?
封装的意义是?
不是可以通过set***()方法和get***()方法得到或修改他的值,那么意义如何体现呢?

想了好久,好乱

另外,什么叫工厂方法呢?

求前辈指点迷津

我知道封装是为了数据的安全性,但是............


------解决方案--------------------
set / get 方法可以对对象中的某一个属性进行操作,访问这些数据对外只提供了这么一个接口。

如果不提供这些方法,属性若为 private 就变得无法访问了。

如果属性变为 public,就好比,到银行去存钱,不是通过柜面进行操作的,而是直接跑到银行的金库里面自己去拿钱了,这样就很不安全,这个例子中,可以把银行金库中的钱看作是某一对象的属性,而柜面的工作人员、出纳柜台就可以看作是 set / get 方法了,也就是让对外服务提供某些接口,具体里面的操作就隐藏起来了。

工厂方法指的是根据不同的情况产生不同的对象,比如:

public static Dao getDao(String dbmsName) throws UnsupportDatabaseException {
  if( dbmsName.equalsIgnoreCase( "SQL Server ") ) {
    return new SqlServerDao();
  } else if( dbmsName.equalsIgnoreCase( "Oracle ") ) {
    return new OracleDao();
  } else if( dbmsName.equalsIgnoreCase( "MySQL ") ) {
    return new MySQLDao();
  } else {
    throw new UnsupportDatabaseException(dbmsName);
  }
}
其中 Dao 是 SqlServerDao、OracleDao、MySQLDao 的接口。

上面这段代码就是一个典型的工厂方法,通过传入的数据库名称来确定,并获得不同的数据库处理实现。若使用的数据库并没有实现,则进行异常处理。
------解决方案--------------------
set/get方法都实现了当然可以读写。
但是,如果该数据只允许外部读取,就可以不实现set方法:封装

还有一个作用是,实际的属性和返回类型不一样:如用布尔值代表性别,但是看的时候希望看到男性女性,就
get方法为:
String getSex(){
if(set} return "男性 ";
return "女性 ";
}
这也是一种封装,用的人并不需要关心存的是什么东西
------解决方案--------------------
封装是指隐藏对象的属性和实现细节,仅仅对外公开接口。封装能为软件系统带来以下优点:


(1)便于使用者正确的方便的理解和使用系统,防止使用者错误修改系统的属性。还是以供电系统为例,过去房屋墙壁的上方都是电线,现在的房屋里电线都 "不见 "了,在墙壁上只露出了一些电源插口。为什么要把电线藏起来呢?理由很简单,暴露在外面的电线不安全也不美观。
再比如电视机系统,尽管它本身的实现很复杂,但用户使用起来却非常简单,只要通过遥控器上的几个按钮就能享受电视机提供的服务。电视机的实现细节被藏在它的大壳子里,没有必要向用户公开。
(2)有助于建立各个系统之间的松耦合关系,提高系统的独立性。当某一个系统的实现发生变化,只要它的接口不变,就不会影响到其他的系统。
(3)提高软件的可重用性,每个系统都是一个相对独立的整体,可以在多种环境中得到重用。例如干电池就是一个可重用的独立系统,在相机、手电筒、电动剃须刀和玩具赛车中都能发挥作用。
(4)降低了构建大型系统的风险,即使整个系统不成功,个别的独立子系统有可能依然是有价值的。例如相机损坏了,它的干电池依然有用,可以安装到手电筒中。
一个设计良好的系统会封装所有的实现细节,把它的接口与实现清晰的隔离开来,系统之间只通过接口进行通信。面向对象的编程语言主要是通过访问控制机制来进行封装,这种机制能控制对象的属性和方法的可访问性。