Builder模式
1、Builder模式介绍
Builder模式是一步一步创建一个复杂对象的创建型模式,允许用户在不知道内部构建细节的情况下,精细地控制对象的构造流程,使构建过程和部件的表示隔离#开来,使两者之间的耦合降到最低
2、Builder模式的使用场景
(1)相同的方法,不同的执行顺序,产生不同的事件结果时
(2)产品类较为复杂,参数较多,且很多参数都具有默认值
(3)多个部件或零件都可以装配到一个对象中,但是产生运行结果又不相同时
3、Builder模式的实现方法
通过具体的对象来构造抽象类,通过一个Director来封装构建复杂产品对象的过程,对外隐藏构建细节,则利用Buider和Director一起构建复杂且不同的对象,在实际开发过程中则经常忽略Director这个类,取而代之的是
new TestBuilder().setA(“A”).setB(“B”).create()
4、Andriod源码中Builder模式实现
(1)在Andriod源码中的AlertDialog.Builder的源码中,通过Builder来组装Dialog的各个部分,如title、buttons、Message等,将Dialog的构造和表示进行分离,通过在AlertDialog类中建立一个Builder来实现Builder模式,再在里面加入了一个apply函数来实现默认值的添加
5、Builder模式的优点及缺点
优点:良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节,独立容易拓展
缺点:会产生多余对象,消耗内存
原型模式
1、原型模式介绍
原型模式是一个创建型的模式。原型模式表明该模式应该有一个样板实例,用户从对象中复制出一个内部属性一致的对象,这个过程是我们俗称的克隆
2、原型模式的使用场景
(1)类初始化需要消化非常多的资源,通过原型拷贝避免这些消耗
(2)通过new产生一个对象需要非常繁琐的数据准备或访问权限,可用原型模式
(3)一个对象需要给其他对象访问,而且各个调用者可能需要修改其值,可以拷贝多个对象,即保护性拷贝
||再调用clone()函数时不一定比new操作速度快,只有new成本较高时才有效率上的提升,需注意在原型模式下不一定要实现cloneable接口,也有其他实现方式
3、原型模式的实现方式
/*
*类充当一个ConcretePrototype角色,克隆接口则充当prototype
*原型角色
*/
public class WordDocument implements Cloneable {
private String mText;
private ArrayList<String>mImages
= new ArrayList<String>();
@Override
protected WordDocument clone(){
try{
WordDocument doc = (WordDocument)super.clone();
doc.mText = this.mText;
doc.mImages = this.mImages;
return doc;
}catch(Exception e){}
return null;
}
//getter and setter
}
使用方法WordDocument doc = orignDoc.clone();
这种实现方法为浅克隆,就是如果在一个对象中改变它的属性,则它克隆出来的复制品的属性也相应进行更改,因为浅克隆只是单纯引用的形式,如果需要改为深拷贝,则要将里面的mImages对象也调用其clone函数,尽量使用深拷贝则可以避免操作副本时影响原始对象的问题
4、Andriod源码中的原型模式实现
比如Intent的拷贝构造函数是通过每个属性new一次从而实现对象拷贝的
5、原型模式的实际应用
通过返回一个克隆的对象,限制修改,不对外开放,从而保证就算修改了这个对象,也不会影响最初的已登录用户对象,而保证只有同一个包才能访问这个包的私有方法,确保其安全性
6、原型模式优点缺点
优点:原型模式是在内存中二进制流的拷贝,比new好很多,在循环体内产生大量对象时,更好体现这一优点
缺点:直接进行拷贝构造函数不会执行,这个即是优点又是缺点,优点减少了约束,缺点也是减少了约束