克隆羊问题:引出原型设计模式(Prototype模式)

简介: 克隆羊问题:引出原型设计模式(Prototype模式)

💨前提引用

假设有一只羊,叫做“多莉”(就是高中学的那个克隆羊多莉),年龄是3岁,颜色是白色。现在用编程实现对多莉的克隆:即克隆一只跟它一模一样的小羊(名字、年龄和颜色相同)


💨解决方式

一、🍂传统方式

🔥设计代码

先创建多莉这个小羊:


public class Sheep {
    private String name;
    private int age;
    private String color;
    public Sheep(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "Sheep [name=" + name + ", age=" + age + ", color=" + color + "]";
    }
}



创建类People当做生物学家,操作克隆的整个过程


public class People {
    public static void main(String[] args) {
        //原型小羊
        Sheep oldSheep = new Sheep("多莉", 3, "白色");
        //开始克隆
        Sheep newSheep = new Sheep(oldSheep.getName(), oldSheep.getAge(), oldSheep.getColor());
        System.out.println(oldSheep);
        System.out.println(newSheep);
    }
}


是如何操作的呢?由代码可以看出,当我们要克隆一个新的小羊的时候,我们在构造器中直接引用了原型小羊的getAge(),getName(),getColor()的方法,实现了全部的克隆。


运行结果:

image.png


🔥优缺点比较

优点:

优点是比较好理解,简单易操作


缺点:

在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率较低


总是需要重新初始化对象,而不是动态地获得对象运行时的状态, 不够灵活


二、🍂原型模式

🔥思路分析

那么,该如何避免传统方式的缺点呢?我们知道,Java中Object类是所有类的父类,Object类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类要实现一个接口Cloneable,该接口表示该类能够复制且具有复制的能力,由此来引出我们的原型模式。


🔥基本介绍

原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象

原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, 无需知道如何创建的细节

工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建 的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone()

🔥类图分析

image.png


🔥代码设计

让上面的Sheep类实现Cloneable接口后重写clone()方法,代码如下:


@Override
    protected Object clone() {
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return sheep;
    }


最后建一个Client类,用来测试:


public class Client {
    public static void main(String[] args) {
        Sheep oldSheep = new Sheep("多莉", 3, "白色");
        Sheep newSheep = (Sheep) oldSheep.clone();
        System.out.println(oldSheep);
        System.out.println(newSheep);
    }
}


运行结果:

image.png


💨方式比较

那么小伙伴们可能就要问了,这不跟方式一一样吗?没什么简便的地方啊,那么问题来了,假如那只多莉小羊来自于北京,我的克隆羊也必须来自于北京,用方式一的办法,是不是还需要从构造器中手动创建?如果要克隆一百只,一万只,一千万只小羊呢?用方式一是不是很麻烦!而用方式二,设定好需要克隆的小羊后,只需要使用clone()方法就可以一键克隆小羊了,再多的小羊,也不怕!


📕总结

创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率


不用重新初始化对象,而是动态地获得对象运行时的状态


如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化,无需修改代码


在实现深克隆的时候可能需要比较复杂的代码


缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改其源代码,违背了ocp原则,这点需要特别注意.


相关文章
|
21天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
2月前
|
设计模式 安全 Java
Kotlin - 改良设计模式 - 构建者模式
Kotlin - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
51 1
|
3月前
|
设计模式 Java Kotlin
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。对于快速学习Kotlin语法,推荐查看“简洁”系列教程。本文重点介绍了构建者模式在Kotlin中的应用与改良,包括如何使用具名可选参数简化复杂对象的创建过程,以及如何在初始化代码块中对参数进行约束和校验。
39 3
|
4月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
3月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
49 0
|
4月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)

热门文章

最新文章

  • 1
    设计模式转型:从传统同步到Python协程异步编程的实践与思考
    64
  • 2
    C++一分钟之-设计模式:工厂模式与抽象工厂
    54
  • 3
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    61
  • 4
    C++一分钟之-C++中的设计模式:单例模式
    79
  • 5
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    47
  • 6
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    81
  • 7
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    70
  • 8
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    54
  • 9
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    63
  • 10
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    137