android常用设计模式之原型模式

一.定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

当new一个对象需要非常繁琐的数据准备或访问权限时就可以使用原型模式,原型模式就是java中的clone技术,以某个对象为原型,

复制出新的对象,新的对象具有原型对象的特点。

因此原型模式的核心就是clone技术。

 

二.角色

1.抽象原型类(Prototype):抽象类或者接口,用来申明clone方法。

2.具体原型类(ConcretePrototype):要被复制的对象。

3.客户端类(客户端类):要使用原型模式的地方。

 

三.使用说明 

以下是个简单的原型模式的使用:

1.首先我们创建个person类实现Cloneable接口,然后重写clone方法:

public class Person implements Cloneable{
    private String name;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    protected Object clone() {
        Person person=null;
        try {
            person=(Person)super.clone();
            person.name=this.name;
            person.sex=this.sex;
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return person;
    }

}

2.测试:

Person person = new Person();
person.setName("jack");
person.setSex("man");

Person personTwo = (Person) person.clone();
System.out.print(personTwo.toString());

 

三.原型模式的优缺点:

1.优点:

  使用原型模式来创建复杂的对象,可以提升创建对象的效率。

2.缺点:

拷贝对象时不会拷贝构造函数。

 

四.原型模式在android中的使用:

在android中Intent的源码就使用原型模式:

public class Intent implements Parcelable, Cloneable {

private Intent(Intent o, @CopyMode int copyMode) {
    this.mAction = o.mAction;
    this.mData = o.mData;
    this.mType = o.mType;
    this.mPackage = o.mPackage;
    this.mComponent = o.mComponent;

    if (o.mCategories != null) {
        this.mCategories = new ArraySet<>(o.mCategories);
    }

    if (copyMode != COPY_MODE_FILTER) {
        this.mFlags = o.mFlags;
        this.mContentUserHint = o.mContentUserHint;
        this.mLaunchToken = o.mLaunchToken;
        if (o.mSourceBounds != null) {
            this.mSourceBounds = new Rect(o.mSourceBounds);
        }
        if (o.mSelector != null) {
            this.mSelector = new Intent(o.mSelector);
        }

        if (copyMode != COPY_MODE_HISTORY) {
            if (o.mExtras != null) {
                this.mExtras = new Bundle(o.mExtras);
            }
            if (o.mClipData != null) {
                this.mClipData = new ClipData(o.mClipData);
            }
        } else {
            if (o.mExtras != null && !o.mExtras.maybeIsEmpty()) {
                this.mExtras = Bundle.STRIPPED;
            }

            // Also set "stripped" clip data when we ever log mClipData in the (broadcast)
            // history.
        }
    }
}

@Override
public Object clone() {
    return new Intent(this);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值