Java设计模式-原型模式(3)

简介: Java设计模式-原型模式(3)

大家好,我是馆长!从今天开始馆长开始对java设计模式的创建型模式中的单例模式、原型模式、工厂方法、抽象工厂、建造者的原型模式进行讲解和说明。

原型模式(Prototype Pattern)

image.png

定义

原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。

解决问题

它主要面对的问题是:“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

实现

由于Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。原型模式的克隆分为 浅克隆 和 深克隆 。

浅拷贝:当拷贝对象包含基本数据类型(如int、long)或者不可变的对象(如字符串、基本类型的包装类)时,会直接将这些属性复制到新的对象中。而原型对象中的引用对象会把内存中的地址复制给克隆对象。对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。

深拷贝:不管原型对象属性是简单数据类型还是引用对象类型都会完全的复制一份到新的对象中。两个对象之间互不影响。属性中引用的其他对象也会被克隆,不再指向原有对象地址。

结构

原型模式包含以下主要角色。

1.抽象原型类:规定了具体原型对象必须实现的接口(Cloneable 接口)。

2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。

3.访问类:使用具体原型类中的 clone() 方法来复制新的对象。

注意:

1.抽象原型类可以利用Cloneable 接口扩展,也可以直接实现Cloneable接口。尽量设计为抽象的基类。

2.复制一般去重写clone() 方法,进行类的返回。

代码实现:浅克隆

//抽象类 实现 Cloneable
@Data
public abstract class Shape implements Cloneable {

private String id;
protected String type;
//具体业务操作方法
abstract void draw();
public Object clone() {
    Object clone = null;
    try {
        clone = super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return clone;
}

}
//抽象类的 具体实现
public class Circle extends Shape {
public Circle(){
type = "Circle";
}

//具体业务在具体实现中 定义
@Override
public void draw() {

System.out.println("Shape:" + this.type +

"具体业务,画了个Circle ");

}
}
//具体实现2
public class Rectangle extends Shape {

public Rectangle() {
    type = "Rectangle";
}

@Override
public void draw() {

System.out.println("Shape:" + this.type +

"具体业务,画了个Rectangle ");

}
}
//具体实现3
public class Square extends Shape {

public Square(){
    type = "Square";
}
//具体业务3的实现
@Override
public void draw() {

System.out.println("Shape:" + this.type +

" 具体业务,画了个 Square");

}
}
//模拟原型库信息
public class ShapeData {

private static Hashtable<String, Shape> shapeMap
        = new Hashtable<>();

public static Shape getShape(String shapeId) {
    Shape cachedShape = shapeMap.get(shapeId);
    return (Shape) cachedShape.clone();
}

// 添加具体业务,如:添加三种形状
public static void loadCache() {
    Circle circle = new Circle();
    circle.setId("c");
    shapeMap.put(circle.getId(), circle);

    Square square = new Square();
    square.setId("s");
    shapeMap.put(square.getId(), square);

    Rectangle rectangle = new Rectangle();
    rectangle.setId("r");
    shapeMap.put(rectangle.getId(), rectangle);
}

}
//模拟应用客户端
public class ClientDemo {
public static void main(String[] args) {
//初始化 原型库
ShapeData.loadCache();

    Shape clonedShape = ShapeData.getShape("s");
    clonedShape.draw();

    Shape clonedShape2 = ShapeData.getShape("c");
    clonedShape2.draw();

    Shape clonedShape3 = ShapeData.getShape("r");
    clonedShape3.draw();
}

}

深克隆:

1.Serializable接口,利用序列化

//序列化 -深克隆
public Object deepClone(){
//创建流对象
ByteArrayInputStream bis=null;
ByteArrayOutputStream bos=null;
ObjectInputStream ois=null;
ObjectOutputStream oos=null;

try{
    bos=new ByteArrayOutputStream();
    oos=new ObjectOutputStream(bos);
    oos.writeObject(this);

    bis=new ByteArrayInputStream(bos.toByteArray());
    ois=new ObjectInputStream(bis);
    Square o = (Square) ois.readObject();
    return o;

} catch (ClassNotFoundException | IOException e) {
    e.printStackTrace();
    return null;
}
  1. 就是在克隆对象的时候,对该对象的对象字段进行克隆,然后进行重新赋值。

protected Object clone() throws CloneNotSupportedException {
//需要可用的类
PClass deep=null;
deep=super.clone();
PClass d=(PClass) deep;
//克隆类中的对象实体
d.sClass= (sClass) sClass.clone();
return d;
}
好了,关于原型模式的说明,馆长就先讲到这里。谢谢各位看官!!

23 种设计模式不是孤立存在的,很多模式之间存在一定的关联关系,在大的系统开发中常常同时使用多种设计模式,或者模式与模式之间的组合进行生成更加强大的程序功能。

相关文章
|
3月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
389 2
|
3月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
383 0
|
5月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
3月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
445 35
|
3月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
351 8
|
8月前
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
252 15
|
8月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
186 0
|
5月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
5月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
10月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。

热门文章

最新文章