设计模式之原型模式

简介: 设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。 本文:http://www.cnblogs.com/xudong-bupt/p/3506450.html 1.C++中的解决方案   在C++中默认提供了copy构造函数、copy assignment操作符,可以实现对象的内存拷贝,节省了新构造对象的开销,其中的实现机制就是操作符重载。

设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。

本文:http://www.cnblogs.com/xudong-bupt/p/3506450.html

1.C++中的解决方案

  在C++中默认提供了copy构造函数、copy assignment操作符,可以实现对象的内存拷贝,节省了新构造对象的开销,其中的实现机制就是操作符重载。C++代码如下:

 1 #include <iostream>
 2 #include <string.h>
 3 using namespace std;
 4 
 5 class Point{
 6 public:
 7     Point(const int _x,const int _y):x(_x),y(_y){}
 8 
 9     int x;
10     int y;
11 };
12 
13 int main(){
14     Point p1(5,5);
15     Point p2=p1;    ///或者Point p2(p1);
16     p2.x=6;
17 
18     cout<<"p1.x="<<p1.x<<endl;
19     cout<<"p2.x="<<p2.x<<endl;
20     return 0;
21 }

代码中使用了C++默认提供的copy构造函数或者copy assignment操作符,从内存拷贝新建对象,速度快。

执行结果:

2.java中的解决方案

2.1 Java中没有提供“=”的copy assignment操作符等

  Java中的“=”对于对象类型是共享对象的引用,而不是复制对象。对其中一个引用修改数据,其他引用就同时能够看到。如下图所示:

  代码如下:

 1 public class TestClone{
 2     public static void main(String[] arg){
 3         Point p1=new Point(5,5);
 4         
 5         Point p2=p1;
 6         p2.x=10;
 7         System.out.println("p1.x="+p1.x);  //(10)
 8         System.out.println("p2.x="+p2.x);  //(10)
 9     }
10 }
11 
12 class Point{
13     int x;
14     int y;
15     Point(int _x,int _y){
16         this.x=_x;
17         this.y=_y;
18     }
19 }

2.2 Java中提供了Cloneable关键字

Java中提供了Cloneable关键字来标示这个对象是可以拷贝的。Cloneable接口中没有一个方法,只起到标示作用。

clone()方法是Object类提供的方法,只用重写“clone()”方法就能实现对象拷贝。

 对象拷贝有分为:深拷贝、浅拷贝。看下面的代码:

 1 public class TestClone{
 2     public static void main(String[] arg){
 3         Point p1=new Point(5,5);
 4         Point p3=(Point) p1.clone();
 5         p3.y=-10;
 6         p3.mes[0]=20;
 7         System.out.println("p1.y="+p1.y+",p3.y="+p3.y);
 8         System.out.println("p1.mes[0]="+p1.mes[0]+",p3.mes[0]="+p3.mes[0]);
 9     }
10 }
11 
12 class Point  implements Cloneable{
13     int x;
14     int y;
15     int mes[];
16     Point(int _x,int _y){
17         this.mes=new int[2];
18         this.x=_x;
19         this.y=_y;
20         this.mes[0]=_x;
21         this.mes[1]=_y;
22     }
23     
24     @Override
25     public Point clone(){
26         Point tt=null;
27         try{
28             tt=(Point)super.clone();
29             //tt.mes=(int[])this.mes.clone();     //深拷贝
30         }
31         catch(Exception e){    }
32         return tt;
33     }
34 }

注释掉第29行执行结果(浅拷贝):

p1.y=5,p3.y=-10
p1.mes[0]=20,p3.mes[0]=20

不注释掉第29行执行结果(深拷贝):

p1.y=5,p3.y=-10
p1.mes[0]=5,p3.mes[0]=20

 深拷贝、浅拷贝区别:Java类中除基本类型(包含String)外其他复杂数据类型的拷贝,必须使用深拷贝。数组,其他类对象的拷贝,都要用到深拷贝。

3.注意

  学的编程语言多了,就得注意他们之间的不同。

  Java和C/C++的“=”是不同的,java中“=”将类对象的引用加1;C++中由于重载操作符“=”,会拷贝类对象。

相关文章
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
347 4
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
364 1
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
259 0
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
360 15
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,适用于创建成本高或复杂的对象场景。其核心思想是“克隆”,避免直接实例化类。结构上分为抽象原型类、具体原型类和客户端。优点包括减少对象创建成本、隐藏复杂性、简化实例创建;缺点是处理循环引用的复杂对象时较为麻烦。实现步骤为定义原型类、重写`clone()`方法并调用。注意事项包括浅拷贝与深拷贝的区别及`Cloneable`接口的使用。
339 20
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
242 0
Java设计模式-原型模式(3)
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
299 6
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
设计模式 Java
【设计模式系列笔记】原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而无需知道其具体类型。这种模式属于对象创建型模式,通过克隆来避免使用new关键字创建对象,提高性能和降低系统的耦合度。
339 6