6月24 面向對象的設計原則-----工廠模式和單列模式

工廠模式:

工廠模式就是專門負責將大量有共同接口的類實例化,而且不必事先知道每次是要實例化哪一個類的模式。它定義一個用于創建對象的接口,由子類決定實例化哪一個類。

工廠模式相當于創建實例對象的new,經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,工廠模式是現今最常用的模式,在Java程序系統中隨處可見。

<?php
class YunSuan
{public $a;public $b;    //寫空的操作方法public function Suan(){        }
}
//面向操作的繼承之前學過(可擴展性比較高)
class Jia extends YunSuan
{public function Suan(){return $this->a+$this->b;    }
}//工廠模式:
//工廠類:生產對象
class GongChang
{//不需要造對象直接就可以調用static function ShengChan($ysf){switch($ysf){case "+":return new Jia();break;case "-":return new Jian();break;    }}
}$jia = GongChang::ShengChan("+");
$jia->a = 10;
$jia->b = 19;
var_dump($jia);
echo $jia->Suan();

使用工廠模式的好處是:使用類的人不必知道做的是什么類,只需要知道工廠類,然后賦予相應的參數,會自動造出相應的對象,然后調用相應的方法即可。為防止類里面有很多參數容易記混可以使用工廠模式,傳入易懂得參數調用相應的方法

?

單例模式:

單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便

對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。顯然單例模式的要點有三個:一是某個類只能有一個實例;二是它

必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。

我們的類在造對象的時候只允許用戶造一個對象,多了不可以。像之前的數據訪問類DBDA,每次在使用的時候都需要new

特別注意以下的注釋部分:

??

<?php
class DBDA
{//連接數據庫的類讓他只能造一個對象出來,在不加任何控制的時候可以造很多的類出來//在造對象的時候會調用構造的方法,//把構造方法變成私有的就可以可以控制住public static $dx;//用來存儲對象//把構造做為私有的private function __construct(){}    //生成對象的方法//為了使該方法能夠較簡單的被調用因此做成靜態的static function DuiXiang(){//因為存儲的對象$dx是靜態的因此使用selfif(empty(self::$dx)){self::$dx = new DBDA();}return self::$dx;}}//可以控制住不讓他隨便new但是又有新的問題就是現在一個對象都造不出來了
//$db = new DBDA();//下面是不會報錯的,單例模式
$db = DBDA::DuiXiang();

單例模式的目的是將類只能造一個對象出來

單例模式的主要方法是:將構造 變成私有的-->做一個靜態的生成對象的方法-->造一個靜態的存儲對象-->return 靜態的對象

面向對象設計的原則

OOD基本上有6大原則,而實際上都是互補的,也就是說一些原則需要利用另一些原則來實現自己。6大原則如下:

1) Open-Close Principle(OCP),開-閉原則,講的是設計要對擴展有好的支持,而對修改要嚴格限制。這是最重要也是最為抽象的原則,基本上我們所說的Reusable Software既是基于此原則而開發的。其他的原則也是對它的實現提供了路徑。

2) Liskov Substituition Principle(LSP),里氏代換原則,很嚴格的原則,規則是“子類必須能夠替換基類,否則不應當設計為其子類。”也就是說,子類只能去擴展基類,而不是隱藏或覆蓋基類。


3) Dependence Inversion Principle(DIP),依賴倒換原則,“設計要依賴于抽象而不是具體化”。換句話說就是設計的時候我們要用抽象來思考,而不是一上來就開始劃分我需要哪些哪些類,因為這些是具體。這樣做有什么好處呢?人的思維本身實際上就是很抽象的,我們分析問題的時候不是一下子就考慮到細節,而是很抽象的將整個問題都構思出來,所以面向抽象設計是符合人的思維的。另外這個原則會很好的支持OCP,面向抽象的設計使我們能夠不必太多依賴于實現,這樣擴展就成為了可能,這個原則也是另一篇文章《Design by Contract》的基石。

4) Interface Segregation Principle(ISP),接口隔離原則,“將大的接口打散成多個小接口”,這樣做的好處很明顯,我不知道有沒有必要再繼續描述了,為了節省篇幅,實際上我對這些原則只是做了一個小總結,如果有需要更深入了解的話推薦看《Java與模式》,MS MVP的一:本巨作!^_^

5) 單一職責:一個類的功能盡量單一,降低耦合

6) Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法則或最少知識原則,這個原則首次在Demeter系統中得到正式運用,所以定義為迪米特法則。它講的是“一個對象應當盡可能少的去了解其他對象”。也就是又一個關于如何松耦合(Loosely-Coupled)的法則。

好了,以上是6大原則(或法則)的介紹,對這些原則的深入研究正是如何得到設計模式的道路。在進行了深入了解后我們就可以開始看看設計模式了,設計模式正是對這些法則的應用,著名的設計模式有四人幫(Gang of Four,GoF)的23個模式,除此之外還有很多其他的一些著名模式,大家可以慢慢研究,如果能自己產出一兩個模式的話那就太好了,證明你也是高手了!^_^

轉載于:https://www.cnblogs.com/Duriyya/p/5616827.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374433.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374433.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode Subsets

原題鏈接在這里&#xff1a;https://leetcode.com/problems/subsets/ 題目&#xff1a; Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must be in non-descending order.The solution set must not contain duplicate su…

使用ThreadPoolExecutor并行化獨立的單線程任務

Java SE 5.0中引入的任務執行框架是簡化多線程應用程序的設計和開發的巨大飛躍。 該框架提供了用于管理任務概念&#xff0c;管理線程生命周期及其執行策略的工具。 在此博客文章中&#xff0c;我們將描述該框架的功能&#xff0c;靈活性和簡單性&#xff0c;以展示一個簡單的用…

python定義一個圓_Python-矩形和圓形

原博文 2019-11-11 12:34 ? Exercise 15.1. 定義一個叫做Circle 類&#xff0c;類的屬性是圓心 (center) 和半徑 (radius) , 其中&#xff0c;圓心 (center) 是一個 Point 類&#xff0c;而半徑 (radius) 是一個數字。 實例化一個圓心 (center) 為 (150, 100) &#xff0c;半…

C語言代碼規范(四)命名規則

一、宏定義全部字母大寫&#xff0c;單詞間下劃線間隔 #define FLASH_PAGE_SIZE 256 #define FLASH_SECTOR_SIZE (4 * 1024) #define FLASH_BLOCK_SIZE (64 * 1024) #define FLASH_SIZE (16 * 1024 * 1024) 二、const修飾的常量全部字母大寫&#xff0c;單詞間…

Forbidden You don't have permission to access / on this server PHP

Forbidden You dont have permission to access / on this server PHP 在新安裝的谷歌游覽器里&#xff0c;打不了PHP網站了&#xff0c;錯誤顯示&#xff1a; Forbidden You dont have permission to access / on this server. 原因還是配置權限問題 解決辦法&#xff1a; wa…

Spring 3.1和JPA的持久層

1.概述 本教程顯示了如何使用Hibernate作為持久性提供程序使用JPA設置Spring 。 有關使用基于Java的配置和項目的基本Maven pom設置Spring上下文的分步介紹&#xff0c;請參閱本文 。 2. Java的JPA Spring配置 要在Spring項目中使用JPA&#xff0c; 需要設置EntityManager 。…

150928錯誤認識

1. $arr array(); foreach ($re as $k>$v){  $arr[] $v[updatetime];} $arr的返回結果為&#xff1a; Array ([0] > 2014-09[1] > 2015-04[2] > 2015-09 )$arr array(); foreach ($re as $k>$v){  $arr[$k] $v[updatetime];} $arr的返回結果為&#xff…

STM32F1筆記(一)GPIO輸出

GPIO&#xff1a;General Purpose Input Output &#xff08;通用輸入/輸出&#xff09;。 GPIO最經典應用&#xff1a;LED燈。 先看電路。聲明&#xff1a;參考正點原子戰艦開發板。 與LED串聯的電阻稱為限流電阻。 限流電阻計算公式&#xff1a;R(U-LED壓降)/20ma。 U為LE…

dataframe轉化為array_【Python專欄】12 種高效 Numpy 和 Pandas 函數為你加速分析

來源&#xff1a;機器之心編譯&#xff1a;Jamin、杜偉、張倩我們都知道&#xff0c;Numpy 是 Python 環境下的擴展程序庫&#xff0c;支持大量的維度數組和矩陣運算&#xff1b;Pandas 也是 Python 環境下的數據操作和分析軟件包&#xff0c;以及強大的數據分析庫。二者在日常…

具有GlassFish和一致性的高性能JPA –第1部分

您以前聽說過連貫性嗎&#xff1f; 大概是。 它是那些著名的內存網格解決方案之一&#xff0c;該解決方案承諾了超快的數據訪問速度和對經常使用的數據的無限空間。 一些眾所周知的競爭對手是Infinispan &#xff0c; Memcached和Terracotta Ehcache 。 它們都很棒&#xff0c;…

如何在自己的代碼中實現分享視頻文件或者是圖片文件到微信 QQ微博 新浪微博等!!!...

首先在文檔第一句我先自嘲下 &#xff0c; 我是大傻逼&#xff0c; 弄了兩天微信是視頻分享&#xff0c;一直被說為啥跟系統的相冊分享的不一樣&#xff0c;尼瑪&#xff01;&#xff01;&#xff01; 這里來說正文&#xff0c;我這里不像多少太多&#xff0c;大家都是程序猿&a…

sql 數據庫中用創建好的視圖修改表數據

只要滿足下列條件&#xff0c;即可通過視圖修改基礎基表的數據&#xff1a; 1、任何修改&#xff08;包括 UPDATE、INSERT 和 DELETE 語句&#xff09;都只能引用一個基表的列。 2、視圖中被修改的列必須直接引用表列中的基礎數據。不能通過任何其他方式對這些列進行派生&#…

boost原理與sklearn源碼_機器學習sklearn系列之決策樹

一、 Sklearn庫 Scikit learn 也簡稱 sklearn, 自2007年發布以來&#xff0c;scikit-learn已經成為Python重要的機器學習庫了。支持包括分類、回歸、降維和聚類四大機器學習算法。還包含了特征提取、數據處理和模型評估三大模塊。sklearn是Scipy的擴展&#xff0c;建立在NumPy和…

STM32F1筆記(二)GPIO輸入

STM32 GPIO輸入的經典應用是按鍵。 先看電路。聲明&#xff1a;參考正點原子戰艦開發板。 在這里可以看到&#xff0c;KEY_UP按鍵是高電平有效的&#xff0c;即當按下該按鍵時&#xff0c;GPIO讀到高電平。 KEY0/1/2是低電平有效的&#xff0c;即當按下該按鍵時&#xff0c;G…

Google Authenticator:將其與您自己的Java身份驗證服務器配合使用

用于移動設備的Google Authenticator應用程序是一個非常方便的應用程序&#xff0c;它實現了TOTP算法&#xff08;在RFC 6238中指定&#xff09;。 使用Google Authenticator&#xff0c;您可以生成時間密碼&#xff0c;該密碼可用于在共享請求用戶密鑰的身份驗證服務器中授權用…

[Week2 作業] 代碼規范之爭

這四個問題均是出自 http://goodmath.scientopia.org/2011/07/14/stuff-everyone-should-do-part-2-coding-standards/ 。 我對這四個問題均持反駁的看法&#xff0c;下面是我的理由~ Q1&#xff1a;這些規范都是官僚制度下產生的浪費大家的編程時間、影響人們開發效率, 浪費時…

STM32F1筆記(三)UART/USART

UART&#xff1a;Universal Asynchronous Receiver/Transmitter&#xff08;通用異步收/發器&#xff09; USART&#xff1a;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff08;通用同步/異步串行收/發器&#xff09; 從命名即可看出USART就是UART的基礎上…

python安裝界面翻譯_python環境搭建

如果想要運行python需要有解釋器和編輯器。 什么是解釋器 解釋器我們可以把它理解成翻譯官&#xff0c;它是將我們寫的python代碼翻譯成計算機能夠懂得機器語言。 然后計算機收到解釋器的命令來干活&#xff0c;最終再將結果反饋在解釋器中。 解釋器推薦使用anaconda3 什么是an…

無需重新部署Eclipse和Tomcat即可進行更改

他們說&#xff0c;由于應用程序服務器過大&#xff0c;Java的開發速度很慢–您必須重新部署應用程序才能看到所做的更改。 使用PHP&#xff0c;Python等腳本語言時&#xff0c;可以“保存并刷新”。 這個法定問題總結了這個“神話”。 是的&#xff0c;這是一個神話。 您也可以…

進階篇-用戶界面:4.Android中常用組件

1.下拉菜單 在Web開發中&#xff0c;HTML提供了下拉列表的實現&#xff0c;就是使用<select>元素實現一個下拉列表&#xff0c;在其中每個下拉列表項使用<option>表示即可。這是在Web開發中一個必不可少的交互性組件&#xff0c;而在Android中的對應實現就是Spinne…