对原型模式的理解
目录
- 一、原型模式 vs. 传统的复制对象
- 1、传统的复制对象
- 2、原型模式
- 2.1 原型模式是什么?
- 2.2 如何实现呢?(原型模式的思想)
- 2.3 对原型的理解
- 2.4 示例
- 2.4.1 示例1:Java 的 Cloneable (可克隆) 接口就是立即可用的原型模式
- 2.4.2 示例2:克隆时,用户没传入具体的类
一、原型模式 vs. 传统的复制对象
- 第一次看到原型模式这个名字时,我是懵逼的。这是啥意思啊?
- 看了相关介绍后,我更懵逼了,这原型模式不就是复制对象吗?这也能算一种设计模式?
1、传统的复制对象
- 传统的复制对象:必须new一个属于相同类的对象。 然后,必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。
// 示例 public class User { @Getter @Setter private String name; @Setter private String ak; @Setter @Getter private String sk; } public class UserService { public void doProcess(User user) { // 要求拷贝user User copyedUser = new User(); copyedUser.setName(user.getName()); copyedUser.setSk(user.getSk()); // copyedUser.setAk(user.getAk()); // 错误 } }
- 这里有个小问题: 有些对象可能拥有私有成员变量, 它们在对象本身以外是不可见的(如User的ak字段)。
- 传统的复制还有另外一个问题。 必须知道对象所属的类才能创建复制品, 所以代码必须依赖该类。
- 还可能有另外一个问题: 有时只知道对象所实现的接口, 而不知道其所属的具体类, 比如向方法的某个参数传入实现了某个接口的任何对象。
public void execute(IBuy user) { }
2、原型模式
2.1 原型模式是什么?
- 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。(低耦合)
2.2 如何实现呢?(原型模式的思想)
- 原型模式将克隆过程委派给被克隆的实际对象(让传入的对象自身具有克隆能力,调用该对象的克隆(clone)方法,即可完成克隆)。
- 在clone方法中,(1)由于知道自己所属的类,自然可以轻轻松松new一个当前类的对象。(2)由于类中的方法也能访问自己的私有成员变量,因此,可以毫无阻力的将原始对象所有的成员变量值复制到新建对象中。【原型模式解决了传统复制对象的3个问题】
2.3 对原型的理解
- 原型并不是计算机的独有概念,而是生活中的常见概念。当一个产品原型被验证是成功的,后续会被大量复制,并被销售到全国。因此,原型的本质就是被复制。
- 支持克隆(被复制)的对象即为原型。
2.4 示例
2.4.1 示例1:Java 的 Cloneable (可克隆) 接口就是立即可用的原型模式
@ToString public class User implements Cloneable { @Getter @Setter private String name; @Setter private String ak; @Setter @Getter private String sk; @Override public User clone() { try { return (User) super.clone(); } catch (CloneNotSupportedException e) { throw new AssertionError(); } } } public class Application { public static void main(String[] args) { User user = new User(); user.setName("张三"); user.setAk("123456"); user.setSk("654321"); User clonedUser = user.clone(); System.out.println(clonedUser); } } /** User(name=张三, ak=123456, sk=654321) */
- Cloneable仅仅是一个用于标识的接口,里面啥都没有。
public interface Cloneable { }
- Object提供了clone方法
protected native Object clone() throws CloneNotSupportedException;
- 一个类想用Object的clone()方法,那么就必须实现Cloneable接口,否则会抛异常:CloneNotSupportedException。
2.4.2 示例2:克隆时,用户没传入具体的类
public abstract class Shape implements Cloneable { @Override public Shape clone() throws CloneNotSupportedException { return (Shape) super.clone(); } } @Data public class Circle extends Shape { /** * 半径 */ private int radius; } @Data public class Rectangle extends Shape { private int width; private int height; } public class Application { public static void main(String[] args) { Circle circle = new Circle(); circle.setRadius(10); Rectangle rectangle = new Rectangle(); rectangle.setHeight(15); rectangle.setWidth(5); List shapes = new ArrayList(); shapes.add(circle); shapes.add(rectangle); shapes.stream().forEach(shape -> { try { Shape clonedShape = shape.clone(); System.out.println(clonedShape); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); } }); } }
- 即使没传入具体的类(Shape是抽象类),也能完成克隆。
(图片来源网络,侵删)
- 一个类想用Object的clone()方法,那么就必须实现Cloneable接口,否则会抛异常:CloneNotSupportedException。
- Object提供了clone方法
- Cloneable仅仅是一个用于标识的接口,里面啥都没有。
- 支持克隆(被复制)的对象即为原型。
- 原型并不是计算机的独有概念,而是生活中的常见概念。当一个产品原型被验证是成功的,后续会被大量复制,并被销售到全国。因此,原型的本质就是被复制。
- 在clone方法中,(1)由于知道自己所属的类,自然可以轻轻松松new一个当前类的对象。(2)由于类中的方法也能访问自己的私有成员变量,因此,可以毫无阻力的将原始对象所有的成员变量值复制到新建对象中。【原型模式解决了传统复制对象的3个问题】
- 原型模式将克隆过程委派给被克隆的实际对象(让传入的对象自身具有克隆能力,调用该对象的克隆(clone)方法,即可完成克隆)。
- 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。(低耦合)
- 传统的复制对象:必须new一个属于相同类的对象。 然后,必须遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中。
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!