千家信息网

java原型模式怎么实现

发表于:2024-11-20 作者:千家信息网编辑
千家信息网最后更新 2024年11月20日,这篇文章主要介绍"java原型模式怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"java原型模式怎么实现"文章能帮助大家解决问题。原型模式属于对象的创
千家信息网最后更新 2024年11月20日java原型模式怎么实现

这篇文章主要介绍"java原型模式怎么实现"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"java原型模式怎么实现"文章能帮助大家解决问题。

原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。简言之:就是复制粘贴。

介绍

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

主要解决:在运行期建立和删除原型。

何时使用:

1、当一个系统应该独立于它的产品创建,构成和表示时。

2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。

3、为了避免创建一个与产品类层次平行的工厂类层次时。

4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码:

1、实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝。

2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些"易变类"拥有稳定的接口。

应用实例:

1、细胞分裂。

2、JAVA 中的 Object clone() 方法。

优点:

1、性能提高。

2、逃避构造函数的约束。

缺点:

1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

2、必须实现 Cloneable 接口。

使用场景:

1、资源优化场景。

2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。

3、性能和安全要求的场景。

4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

5、一个对象多个修改者的场景。

6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。

实现

我们将创建一个抽象类 Shape 和扩展了 Shape 类的实体类。下一步是定义类 ShapeCache,该类把 shape 对象存储在一个 Hashtable 中,并在请求的时候返回它们的克隆。

PrototypePatternDemo,我们的演示类使用 ShapeCache 类来获取 Shape 对象。

步骤 1

创建一个实现了 Cloneable 接口的抽象类。

Shape.javapublic abstract class Shape implements Cloneable {   private String id;  protected String type;   abstract void draw();   public String getType(){     return type;  }   public String getId() {     return id;  }   public void setId(String id) {     this.id = id;  }   public Object clone() {     Object clone = null;     try {        clone = super.clone();     } catch (CloneNotSupportedException e) {        e.printStackTrace();     }     return clone;  }}

步骤 2

创建扩展了上面抽象类的实体类。

Rectangle.javapublic class Rectangle extends Shape {  public Rectangle(){    type = "Rectangle";  }  @Override  public void draw() {     System.out.println("Inside Rectangle::draw() method.");  }}Square.javapublic class Square extends Shape {  public Square(){    type = "Square";  }  @Override  public void draw() {     System.out.println("Inside Square::draw() method.");  }}Circle.javapublic class Circle extends Shape {  public Circle(){    type = "Circle";  }  @Override  public void draw() {     System.out.println("Inside Circle::draw() method.");  }}

步骤 3

创建一个类,从数据库获取实体类,并把它们存储在一个 Hashtable 中。

ShapeCache.javaimport java.util.Hashtable;public class ShapeCache {     private static Hashtable shapeMap     = new Hashtable();  public static Shape getShape(String shapeId) {     Shape cachedShape = shapeMap.get(shapeId);     return (Shape) cachedShape.clone();  }  // 对每种形状都运行数据库查询,并创建该形状  // shapeMap.put(shapeKey, shape);  // 例如,我们要添加三种形状  public static void loadCache() {     Circle circle = new Circle();     circle.setId("1");     shapeMap.put(circle.getId(),circle);     Square square = new Square();     square.setId("2");     shapeMap.put(square.getId(),square);     Rectangle rectangle = new Rectangle();     rectangle.setId("3");     shapeMap.put(rectangle.getId(),rectangle);  }}

步骤 4

PrototypePatternDemo 使用 ShapeCache 类来获取存储在 Hashtable 中的形状的克隆。

PrototypePatternDemo.javapublic class PrototypePatternDemo {  public static void main(String[] args) {     ShapeCache.loadCache();     Shape clonedShape = (Shape) ShapeCache.getShape("1");     System.out.println("Shape : " + clonedShape.getType());             Shape clonedShape2 = (Shape) ShapeCache.getShape("2");     System.out.println("Shape : " + clonedShape2.getType());             Shape clonedShape3 = (Shape) ShapeCache.getShape("3");     System.out.println("Shape : " + clonedShape3.getType());          }}

步骤 5

执行程序,输出结果:

Shape : CircleShape : SquareShape : Rectangle

关于"java原型模式怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

对象 原型 模式 实例 拷贝 方法 步骤 场景 形状 数据 资源 不同 实体 工厂 接口 用者 知识 类型 存储 多个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 学计算机网络技术学就业方向 服务器主机风扇怎么用 java 爬网页数据库 网络安全法的说法错误的有 福建戴尔服务器维修哪家便宜 源保科技网络安全保险 小米的空间管理服务器 在数据库查询中查询条件分为 北京项目软件开发大概要多少钱 服务器运维性能优化 服务器常见安全问题解决方案 云服务器有什么优惠活动 苏州的互联网科技公司 网络安全密码是 星辉玩的方舟服务器在哪里 义乌电脑软件开发流程八个步骤 计算机网络技术最好的证书 多玩数据库魔兽世界60年代 access数据库是或否 济南市戴尔服务器代理总代 证券资讯数据库 全国网络安全大赛一等奖 福建省公安厅网络安全管理 数据库仪器仪表 gdb数据如何导入到数据库 怎么看服务器在不在服务 在韩国绝地求生切换服务器教程 知网怎么看出论文被数据库收录 2网络安全 上海特定网络技术服务材料
0