原型模式 订阅
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 展开全文
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
信息
外文名
Prototype
问    题
结构复杂的对象”的创建工作
实    现
clone()方法来实现对象的克隆
中文名
原型模式
模    式
Prototype
原型模式定义
原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。 [1] 
收起全文
精华内容
下载资源
问答
  • 设计模式-原型模式

    万次阅读 2019-12-07 22:36:42
    知识点1:什么是原型模式 知识点2:原型模式应用场景 知识点3:原型模式UML类图(通用) 知识点4:实例 知识点5:原型模式分为浅复制和深复制 知识点1:什么是原型模式 克隆 原型模式是一个创建型的模式。...

     

    目录

     

    知识点1:什么是原型模式

    知识点2:原型模式应用场景

    知识点3:原型模式UML类图(通用)

    知识点4:实例

    知识点5:原型模式分为浅复制和深复制


    知识点1:什么是原型模式

    克隆

    原型模式是一个创建型的模式。原型二字表明了改模式应该有一个样板实例,用户从这个样板对象中复制一个内部属性一致的对象,这个过程也就是我们称的“克隆”。被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高效。


    知识点2:原型模式应用场景

    (1)类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等,通过原型拷贝避免这些消耗。 
    (2)通过new产生的一个对象需要非常繁琐的数据准备或者权限,这时可以使用原型模式。 
    (3)一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用,即保护性拷贝。

    Spring框架中的多例就是使用原型。


    知识点3:原型模式UML类图(通用)

    原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 
      (1)实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 
      (2)重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此Prototype类需要将clone方法的作用域修改为public类型。


    知识点4:实例

    /*
     * 书本类型,扮演的是ConcretePrototype角色,而Cloneable扮演Prototype角色
     */
    public class Book implements Cloneable {
    
    	private String title;// 标题
    	private ArrayList<String> image = new ArrayList<String>();// 图片名列表
    
    	public Book() {
    		super();
    	}
    
    	/**
    	 * 重写拷贝方法
    	 */
    	@Override
    	protected Book clone() {
    		try {
    			Book book = (Book) super.clone();//
    			book.image=(ArrayList<String>)this.image.clone();//深复制
    			return book;
    		} catch (CloneNotSupportedException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    
    	public ArrayList<String> getImage() {
    		return image;
    	}
    
    	public void addImage(String img) {
    		this.image.add(img);
    	}
    
    	public String getTitle() {
    		return title;
    	}
    
    	public void setTitle(String title) {
    		this.title = title;
    	}
    
    	/**
    	 * 打印内容
    	 */
    	public void showBook() {
    		System.out.println("----------------------Start----------------------");
    
    		System.out.println("title:" + title);
    		for (String img : image) {
    			System.out.println("image name:" + img);
    		}
    
    		System.out.println("----------------------End----------------------");
    	}
    }
    
    
    客户端代码
    public class Client02 {
    
    	public static void main(String[] args) {
    		Book book1 = new Book();
    		book1.setTitle("书1");
    		book1.addImage("图1");
    		book1.showBook();
    		//以原型方式拷貝一份
    		Book book2 = book1.clone();
    		book2.showBook();
    		book2.setTitle("书2");
    		book2.addImage("圖2");
    		book2.showBook();
    		//再次还原打印书本
    		book1.showBook();
    		}
    
    }

    知识点5:原型模式分为浅复制和深复制

    浅复制 —-只是拷贝了基本类型的数据,而引用类型数据,复制后也是会发生引用,我们把这种拷贝叫做“(浅复制)浅拷贝”,换句话说,浅复制仅仅是指向被复制的内存地址,如果原地址中对象被改变了,那么浅复制出来的对象也会相应改变。

    深复制 —-在计算机中开辟了一块新的内存地址用于存放复制的对象。


     

     

    展开全文
  • 原型模式

    千次阅读 2019-03-03 12:59:51
    今天来学习一下原型模式,咋看这个名字感觉有点抽象。原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。下面看一下C++代码实现。 #include &lt;iostream&gt; #include &...

             今天来学习一下原型模式,咋看这个名字感觉有点抽象。原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。下面看一下C++代码实现。

    #include <iostream> 
    #include <string> 
    #include <list>
    #include <math.h> 
    #include <stdlib.h>
    using namespace std;
    
    
    //原型模式:浅复制
    
    class Cloneable
    {
    	virtual Cloneable *clone()
    	{
    		return new Cloneable();
    	}
    };
    
    class Resume : Cloneable
    {
    public:
    	Resume(string name)
    	{
    		this->name = name;
    	}
    
    	void SetPersonInfo(string sex,string age)
    	{
    		this->sex = sex;
    		this->age = age;
    	}
    
    	void Display()
    	{
    		cout << name << "," << sex << "," << age << endl;
    	}
    
    	Resume *Clone()
    	{
    		return new Resume(*this);
    	}
    
    private:
    	string name;
    	string sex;
    	string age;
    };
    
    
    int main()
    {
    	Resume *a = new Resume("zhangsan");
    	a->SetPersonInfo("man","22");
    
    	Resume *b = (Resume *)a->Clone();
    	a->SetPersonInfo("man","23");
    
    	a->Display();
    	b->Display();
    
            delete a;
            delete b;
      
    	return 0;	
    }
    

    上面是一个填写个人信息的类,如果有多个人,每个人的信息都不一样,不用原型模式的clone就要在main函数中new很多次,这样性能太低了。一般在初始化的信息不发生变化的情况下,克隆是最好的办法。这即隐藏了对象的创建细节,又对性能是大大的提高。

     

     

    参考资料:大话设计模式

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,298
精华内容 9,319
关键字:

原型模式