1. 程式人生 > >WebKit中的設計模式(一): Noncopyable

WebKit中的設計模式(一): Noncopyable

WebKit作為一款優秀的瀏覽器,其中有著非常優秀的設計,值得我們借鑑。本文的目的就是剖析WebKit中值得借鑑的設計模式,瞭解其設計思想,以達到能為我們使用的目的。關於設計模式,推薦閱讀經典書籍<<設計模式-可複用面向物件軟體的基礎>>。本文所分析的設計模式,並非全部都是書上所提及的設計模式。因為設計模式是一個非常泛的概念,只要能夠重複使用且能解決特定問題的設計,應該都可以算作設計模式,希望朋友們不要較真。

言歸正傳,首先我們來分析以下WebKit中Noncopyable的使用。在閱讀WebKit的原始碼過程中,發現很多類都繼承了Noncopyable類。我們來看看Noncopyable的定義:

 

Noncopyable類非常簡單,就是將拷貝建構函式和=操作符定義成私有。這樣做的目的是什麼呢?

我們知道,如果我們沒有為類定義拷貝建構函式和賦值操作f符,編譯器會自動為我們提供拷貝建構函式和賦值操作符。所以下面的程式碼可以正常工作:

 

問題在於,編譯器提供的拷貝建構函式只是進行"淺"拷貝,考慮下面的程式碼會碰到什麼問題?

 

因為x和xx的a欄位指標指向同一個地址,這樣物件銷燬是,存在兩次釋放同一指標的問題。如何避免這種問題呢,一種方法是加上說明,提醒類的使用者本類不能進行拷貝構造和賦值操作,這顯然不是一個好的解決方法,另外一種方法是禁止訪問它的拷貝建構函式和賦值操作符(可以將拷貝建構函式和賦值操作符方法設為私有或保護)。WebKit中給出了一個更好的解決方法,就是定義Noncopyable基類,從Noncopyable類派生的類預設不能進行拷貝構造和賦值操作。但也並非完全禁止拷貝構造和賦值操作,只要我們顯示的提供拷貝建構函式和賦值操作,物件還是可以進行拷貝構造和賦值操作,但這是在我們的控制之下。

在其它庫中我們也可以看到這樣的設計,比如boost庫也定義了一個boost::noncopyable類。

相關推薦

WebKit設計模式(): Noncopyable

WebKit作為一款優秀的瀏覽器,其中有著非常優秀的設計,值得我們借鑑。本文的目的就是剖析WebKit中值得借鑑的設計模式,瞭解其設計思想,以達到能為我們使用的目的。關於設計模式,推薦閱讀經典書籍<<設計模式-可複用面向物件軟體的基礎>>。本文所分析的

WebKit設計模式(),開篇

設計模式是一種思想,是智慧的結晶了.它有利於我們快速構建高效,模組化,高擴充套件性的程式碼.這種思想不僅僅在c++中有,c程式碼中也是有很充分的使用. 設計模式是前提,是重中之重,那比它更重要的是什麼?是原則! 面向物件設計五大原則 1. 單一職責原則(SRP:Single

23設計模式概括及六種設計原則(

一、設計模式分類 總體來說模式依據目的可分為建立型模式(Creational)、結構型模式(Structural)、行為型模式(Behavioral)三種。 建立型模式:處理物件的建立。共5種:工廠方法模式(Factory Method)、抽象工廠模式(Abstract Factory)、建造者模式(Bu

根據Spring的核心IoC深度理解設計模式()

學習Spring系列,永遠離不開的就是IoC控制反轉和AOP面向切面程式設計,並且在其中充滿了設計模式的魅力. 之前面試也被問到過,簡單的理解過程是不夠的,敗在了理解原始碼上面,為了今後的學習,想用原始碼去理解一下到底什麼IoC和AOP。 首先是IoC,所謂控制

設計模式():“穿越火線”的“策略模式”(Strategy Pattern)

在前段時間呢陸陸續續的更新了一系列關於重構的文章。在重構我們既有的程式碼時,往往會用到設計模式。在之前重構系列的部落格中,我們在重構時用到了“工廠模式”、“策略模式”、“狀態模式”等。當然在重構時,有的地方沒有點明使用的是那種設計模式。從今天開始,我們就圍繞著設計模式這個主題來討論一下我們常用的設計模式,當然

設計模式(續)

pan har cnblogs 變量 ring 區別 ack iostream 模式 本篇是接著設計模一:觀察者模式的續寫。 為什麽要寫這一篇呢: java在main函數裏new出的對象都是局部變量,而用C++ 在main函數裏new出來的都是 動態分配到堆區的。 那麽可不

java23設計模式之適配器模式

print 鍵盤 分享 rri sys 完成 out img closed package com.bjsxt.adapter; /** * 被適配的類 * (相當於例子中的,PS/2鍵盤) * @author Administrator * */

Javascript設計模式()States

tsa 調用 ++ for true 一個 show 改變 設計模式 1.當一個對象內部的狀態發生改變的時候會導致其行為發生改變 //狀態對象的實現 var ResutlState=function(){ var States={

.net4.0設計模式()使用Lazy的單例模式

private 延遲 是否 方式 get pub ram creat 程序 延遲加載,亦稱延遲實例化,延遲初始化等, 主要表達的思想是,把對象的創建將會延遲到使用時創建,而不是在對象實例化時創建對象,即用時才加載。這種方式有助於提高於應用程序的性能,避免浪費計算,節省內存的

Java 23設計模式

叠代 職責鏈模式 方法 備忘錄模式 創建型 抽象工廠 適配器 狀態模式 橋接模式 創建型模式(5):   --單例模式、工廠模式、抽象工廠模式、建造者模式、原型模式。 結構型模式(7):   --適配器模式、橋接模式、裝飾模式、組合模式、外觀模式、享元模式、代理模式。 行為

java23設計模式之叠代器模式

asn spl gre ring ext concrete sta get face package com.bdqn.iterator; public interface MyIterator { //將遊標指向第一個元素 void first()

java23設計模式之策略模式

log author 批量 isp contex view strategy ext 不同 package com.bjsxt.strategy; /** * 負責和具體的策略類交互 * 這樣的話,具體的算法和直接的客戶端調用分離了,使得算法可以獨立於客戶端獨立

java23設計模式之代理模式

唱歌 [] lap pen 技術分享 contract rac display images staticproxy ---靜態代理 package com.bjsxt.proxy.staticProxy; public interface Star

設計模式(單例模式)

div 有一個 pri 模式 過程 spa color public ati 記錄學習過程 單例模式:單例模式就是保證一個類,只有一個實例; class Singleton { private static Singleton _insta

23設計模式包括哪些

單例模式 自動更新 %20 att 技術 讓其 emp 直接 獲得 傳送門(轉載):https://www.cnblogs.com/Leo_wl/p/6067267.html 附(github設計模式):https://github.com/iluwatar/java-d

設計模式:叠代器(Iterator)模式

open 先來 strac alt rri print pre 並且 3-0 一、什麽是叠代器模式   說白了就是一種遍歷集合中元素的一種設計模式,我們趕緊先來看一下例子 二、實現舉例   這裏我們舉一個例子,是將書(Book)放置到書架中(BookShelf),一個叠

設計模式()

例子 暫停 code 機會 因此 自己的 別人 block 能夠 在工作3年之後,也算寫了一點代碼。在每天的工作中,越來越感覺‘設計模式’才是程序員的內功心法,是每個程序員最應該花時間鉆研的“九陽神功”。從博客和公眾號推送中,也經常能看到關於設計模式的內容,總是隱隱地感覺那

天一個設計模式() - 總體概述

享元 關註 責任鏈 分布式 分享圖片 模板方法 mage upload 抽象工廠 前言 最近在對設計模式進行了一系列總結,本文將給大家關於設計模式的一個整體的介紹。 正文 1. 定義 設計模式是某類特定問題的代碼設計解決方案,是一套代碼設計的經驗總結。 2. 作用 提高

java23設計模式之觀察者模式

什麼叫觀察者模式? 當被觀察者的資料更新時,將會通知觀察該主題的所有觀察者。就像---微信公眾號就是被觀察者---關注該公眾號的就是觀察者---》 當公眾號更新文章時,關注的人就會獲得該資訊。這就是觀察者模式的應用。 用圖說明: 下面將用程式碼來解釋上面的內容: 1.觀

php的23設計模式

原文地址 https://my.oschina.net/botkenni/blog/1603660   PhpDesignPatterns 【PHP 中的設計模式】 一、 Introduction【介紹】 設計模式:提供了一種廣泛的可重用的方式來解決我們日常