IT铁人DAY 12-Prototype 原型模式

  前几天介绍的都是属於Creational Patter,今天要来介绍最後一个位,也就是Prototype!


问题情境与解析

  假设今天有个复杂的物件,你想要创建它的分身,就必须先创一个同一类别的新物件,然後再遍历(go through)此类的所有属性以後才能复制到新的物件。不过可能会碰到一个问题,就是并不是所有的属性都会是公开的,有可能是私有的,所以不能端看物件的外表而了解其内在。

  当遇到这种情况以後,即使物件本身没有私有的属性,但只要需要创建分身,就得写一大串的程序码将要创建的物件初始化,而这些程序码又是重复的,会造成程序码显得又臭又长。

  倘若使用Prototype,所有支援克隆(clone)的物件都会有个共同的介面,而克隆的方法都会在所有的类别实现,此方法会创建一个当前类别的物件,并将旧物件所有的属性复制到新的物件上,即使是私有的属性也会移并复制过去。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20210927/20140743bQU1SUlDHX.png

Skeleton Code

abstract class Prototype {
    Type field;
    
    Prototype(Prototype prototype) {
        this.field = prototype.field;
    }
    
    public abstract Prototype clone();
}

class ConcretePrototype extends Prototype {
    Type field1;
    
    ConcretePrototype(ConcretePrototype prototype) {
		// fields defined in the parent class.
        super(prototype);
        this.field1 = prototype.field1;
    }
    
    public Prototype clone() {
        return new ConcretePrototype(this);
    }
}

  Prototype运行的方式其实很简单,就是当你创建一个物件,并且初始化完,尔後需要再一个相同的物件时,只需要克隆一原型就可以了,不用再写重复的程序码将物件初始化,而且客户端只须要有所有支援克隆方法物件的共同介面,并不需要去耦合到具体类别就能够克隆物件,非常方便!


除此之外,也欢迎大家走走逛逛关於我们团队夥伴的文章

lu23770127 - SASS 基础初学三十天

10u1 - 糟了!是世界奇观!

juck30808 - Python - 数位行销分析与 Youtube API 教学

SiQing47 - 前端?後端?你早晚都要全端的,何不从现在开始?


<<:  Day.18 「从函式物件认识 作用域 与 提升!」 —— JavaScript 函式(Function) & 作用域(Scope) & 提升(Hoisting)

>>:  追求JS小姊姊系列 Day12 -- 还是没躲掉,方函式登场

[DAY-30 ] 再怎样潇洒总要有个结尾,你也知道潇洒美少男没有甩头的结尾是行不通的。

And So It Is. 就这拉! 我们明年见 :) 等有 FU 再来补三八的话 又或着 就这样...

必然 (1) 导论与前言

进入到铁人赛第 20 天。在摸索 20 天,我大概找到一种「每天花 90 分钟看书并摘要点什麽」的节...

【Day.28】React进阶 - 导入Redux,让元件沟通更简洁

当专案中的阶层变复杂,state和props变的很多,资料在多层component之间的传递也越来越...

Day 14:动态 Route 对号入座

上篇完成了巢状路由的设置之後,紧接着新需求又出现了!接续会员後台的收藏纪录页面,我们要进一步让收藏的...

Day 6 Swift语法-基础篇(4/5)-Function

今天谈到最常用的函式 function 一般来说,函式的定义方式如图中所示 name: 代表函式的名...