Android的设计模式-原型模式

前言

Android的设计模式系列文章介绍,欢迎关注,持续更新中:

Android的设计模式-设计模式的六大原则
创建型模式:
Android的设计模式-单例模式
Android的设计模式-建造者模式
Android的设计模式-工厂方法模式
Android的设计模式-简单工厂模式
Android的设计模式-抽象工厂模式
Android的设计模式-原型模式
行为型模式:
Android的设计模式-策略模式
Android的设计模式-状态模式
Android的设计模式-责任链模式
Android的设计模式-观察者模式

1.定义

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

2.介绍

  • 原型模式属于创建型模式。
  • 一个已存在的对象(即原型),通过复制原型的方式来创建一个内部属性跟原型都一样的新的对象,这就是原型模式。
  • 原型模式的核心是clone方法,通过clone方法来实现对象的拷贝。

3.UML类图

原型模式UML类图.png

3.1 角色说明:
  • Prototype(抽象原型类):抽象类或者接口,用来声明clone方法。
  • ConcretePrototype(具体原型类):即要被复制的对象。
  • Client(客户端类):即要使用原型模式的地方。

4.实现

4.1 Prototype(抽象原型类):

  • 通常情况下,Prototype是不需要我们去定义的。因为拷贝这个操作十分常用,Java中提供了Cloneable接口来支持拷贝操作,它就是原型模式中的Prototype。
  • 当然,原型模式也未必非得去实现Cloneable接口,也有其他的实现方式。

4.2 创建具体原型类,实现Cloneable接口:

//具体原型类,卡片类
public class Card implements Cloneable {
   //实现Cloneable接口,Cloneable只是标识接口
    private int num;//卡号

    private Spec spec = new Spec();//卡规格

    public Card() {
   
        System.out.println("Card 执行构造函数");
    }

    public void setNum(int num) {
   
        this.num = num;
    }

    public void setSpec(int length, int width) {
   
        spec.setLength(length);
        spec.setWidth(width);
    }

    @Override
    public String toString() {
   
        return "Card{" +
                "num=" + num +
                ", spec=" + spec +
                '}';
    }

    @Override
	protected Card clone() throws CloneNotSupportedException {
   //重写clone()方法,clone()方法不是Cloneable接口里面的,而是Object里面的
			System.out.println("clone时不执行构造函数");
			return (Card) super.clone();
	}
}

//规格类,有长和宽这两个属性
public class Spec {
   
	private int width;
	private int length;

	public void setLength(int length) {
   
		this.length = length;
	}

	public void setWidth(int width) {
   
		this.width = width;
	}

	@Override
	public String toString() {
   
		return "Spec{" +
				"width=" + width +
				", length=" + length +
				'}';
	}
}

4.3 创建客户端类,即要使用原型模式的地方:

    public class Client {
   
        public void test() throws CloneNotSupportedException {
   
        
            Card card1 = new Card();
            card1.setNum(9527);
            card1.setSpec(10
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值