原型模式

本文介绍了原型模式,包括浅克隆和深克隆的概念及其实现方式,并通过苹果订单类的示例展示了如何使用这两种克隆方式。

一.原型模式

原型模式,即克隆模式,主要采用浅克隆和深克隆,两种模式进行,省去创建对象的初始化时间和代码

1.浅克隆

新建一苹果类,有名称以及颜色属性

public class Apple {

    public Apple(String color, String name) {
        this.color = color;
        this.name = name;
    }

    private String color ;

    private String name;

}

再新建一苹果订单类,有苹果引用以及数量属性--实现jdk中Cloneable接口,重写clone方法

// 实现Cloneable接口
public class AppleOrder implements Cloneable {

    public AppleOrder(Apple apple, Integer num) {
        this.apple = apple;
        this.num = num;
    }

    private Apple apple;

    private Integer num;

    // 重写clone方法
    @Override
    protected AppleOrder clone() throws CloneNotSupportedException {
        AppleOrder appleOrder = (AppleOrder)super.clone();
        return appleOrder;
    }

    public Apple getApple() {
        return apple;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }

    public Integer getNum() {
        return num;
    }

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

再建一测试类,进行测试

public class Test {
    public static void main(String[] args) throws Exception{
        Apple apple = new Apple("red","apple");
        AppleOrder appleOrder1 = new AppleOrder(apple,20);
        AppleOrder appleOrder2 = appleOrder1.clone();
        System.out.println(appleOrder1);
        System.out.println(appleOrder2);
        System.out.println(appleOrder1.getApple());
        System.out.println(appleOrder2.getApple());
    }
}

浅克隆:1.对于基础类型进行克隆,

            2.对于引用类型,仅拷贝应用地址

所以浅克隆后的对象中的,成员变量为引用类型的,都指向同一个对象

2.深度克隆

新建一苹果类,有名称以及颜色属性--苹果类也实现Cloneable接口,重写clone方法

public class Apple implements Cloneable{

    public Apple(String color, String name) {
        this.color = color;
        this.name = name;
    }

    private String color ;

    private String name;

    @Override
    protected Apple clone() throws CloneNotSupportedException {
        return (Apple) super.clone();
    }
}

再新建一苹果订单类,有苹果引用以及数量属性--实现jdk中Cloneable接口,重写clone方法,clone方法中,将引用苹果进行克隆

// 实现Cloneable接口
public class AppleOrder implements Cloneable {

    public AppleOrder(Apple apple, Integer num) {
        this.apple = apple;
        this.num = num;
    }

    private Apple apple;

    private Integer num;

    // 重写clone方法
    @Override
    protected AppleOrder clone() throws CloneNotSupportedException {
        AppleOrder appleOrder = (AppleOrder)super.clone();
        if(apple!=null){
            appleOrder.setApple(apple.clone());
        }
        return appleOrder;
    }

    public Apple getApple() {
        return apple;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }

    public Integer getNum() {
        return num;
    }

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

再建一测试类,进行测试

public class Test {
    public static void main(String[] args) throws Exception{
        Apple apple = new Apple("red","apple");
        AppleOrder appleOrder1 = new AppleOrder(apple,20);
        AppleOrder appleOrder2 = appleOrder1.clone();
        System.out.println(appleOrder1);
        System.out.println(appleOrder2);
        System.out.println(appleOrder1.getApple());
        System.out.println(appleOrder2.getApple());
    }
}

深克隆,即将被克隆对象中成员变量为应用类型的属性,也进行克隆,形成不同对象

3.利用反射机制实现简单克隆方法

新建一苹果类,有名称以及颜色属性--创建无参构造

public class Apple {

    public Apple(String color, String name) {
        this.color = color;
        this.name = name;
    }

    public Apple() {
    }

    private String color ;

    private String name;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 新建一测试类,包含有copy方法

public class Test {
    public static void main(String[] args) throws Exception{
        Apple apple1 = new Apple("red","apple");
        Apple apple2 = copy(apple1);
        System.out.println(apple1);
        System.out.println(apple1.getColor()+":"+apple1.getName());
        System.out.println(apple2);
        System.out.println(apple2.getColor()+":"+apple2.getName());
    }

    public static <T> T copy(Object object)throws Exception {
        Class<?> objectClass = object.getClass();
        // 通过无参构造函数实例化一个对象
        Object objectCopy = objectClass.getConstructor().newInstance();
        // 获得对象的所有成员变量
        Field[] fields = objectClass.getDeclaredFields();
        for (Field field : fields) {
            // 获取成员变量的名字
            String name = field.getName();
            // 首字母大写
            String initialFiledName = name.substring(0, 1).toUpperCase();
            // 拼接成 getName
            String getMethodName = "get" + initialFiledName + name.substring(1);
            // 拼接成 setName
            String setMethodName = "set" + initialFiledName + name.substring(1);
            // 获取get()方法对象
            Method getMethod = objectClass.getMethod(getMethodName);
            // 获取set()方法对象
            Method setMethod = objectClass.getMethod(setMethodName, new Class[]{field.getType()});
            // 调用get方法获取旧的对象的值
            Object value = getMethod.invoke(object);
            // 调用set方法将这个值复制到新的对象中去
            setMethod.invoke(objectCopy, new Object[]{value});
        }
        return (T)objectCopy;
    }
}

测试结果

通过copy方法,生成了新的类,也拷贝了属性

==================================================================================

原型模式的本质:即当我们需要创建多个复杂对象时,我们仅需要创建一个复杂对象(原型),再对其进行copy,这样我们就不需要进行复杂对象的初始化,从而得到多个新的复杂对象. 

本指南详细阐述基于Python编程语言结合OpenCV计算机视觉库构建实时眼部状态分析系统的技术流程。该系统能够准确识别眼部区域,并对眨眼动作与持续闭眼状态进行判别。OpenCV作为功能强大的图像处理工具库,配合Python简洁的语法特性与丰富的第三方模块支持,为开发此类视觉应用提供了理想环境。 在环境配置阶段,除基础Python运行环境外,还需安装OpenCV核心模块与dlib机器学习库。dlib库内置的HOG(方向梯度直方图)特征检测算法在面部特征定位方面表现卓越。 技术实现包含以下关键环节: - 面部区域检测:采用预训练的Haar级联分类器或HOG特征检测器完成初始人脸定位,为后续眼部分析建立基础坐标系 - 眼部精确定位:基于已识别的人脸区域,运用dlib提供的面部特征点预测模型准确标定双眼位置坐标 - 眼睑轮廓分析:通过OpenCV的轮廓提取算法精确勾勒眼睑边缘形态,为状态判别提供几何特征依据 - 眨眼动作识别:通过连续帧序列分析眼睑开合度变化,建立动态阈值模型判断瞬时闭合动作 - 持续闭眼检测:设定更严格的状态持续时间与闭合程度双重标准,准确识别长时间闭眼行为 - 实时处理架构:构建视频流处理管线,通过帧捕获、特征分析、状态判断的循环流程实现实时监控 完整的技术文档应包含模块化代码实现、依赖库安装指引、参数调优指南及常见问题解决方案。示例代码需具备完整的错误处理机制与性能优化建议,涵盖图像预处理、光照补偿等实际应用中的关键技术点。 掌握该技术体系不仅有助于深入理解计算机视觉原理,更为疲劳驾驶预警、医疗监护等实际应用场景提供了可靠的技术基础。后续优化方向可包括多模态特征融合、深度学习模型集成等进阶研究领域。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值