[19/04/23-星期二] GOF23_創建型模式(工廠模式、抽象工廠模式)

一、工廠模式(分為:簡單工廠模式、工廠方法模式、抽象工廠模式)

? ? 實現了創建者和調用者的分離

核心本質:1、實例化對象,用工廠方法代替new操作;2、將選擇實現類、創建對象統一管理和控制,從而將調用者跟實現類解耦。

簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)

工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)

抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)

【擴展】面向對象設計的基本原則(核心就是"分工")

OCP(開閉原則,Open-Closed Principle):一個軟件的實體應當對擴展開放,對修改關閉。

DIP(依賴倒轉原則,Dependence Inversion Principe):要針對接口編程,不要針對實現編程。

LoD(迪米特法則,Law of Demeter):只與你直接的朋友通信,避免和陌生人通信(某個類盡量與少的類反生依賴關系)。

二、各種模式詳解

1、簡單工廠模式(靜態工廠模式)

/*** 一個"汽車"類 接口 */
package cn.sxt.pattern;public interface Car {void run();
}/** "奧迪"類* */
package cn.sxt.pattern;public class Audi implements Car{public void run() {System.out.println("奧迪在跑!");        }
}/*** "比亞迪"類*/
package cn.sxt.pattern;public class Byd implements Car{public void run() {System.out.println("比亞迪在跑!");}
}

【沒有采用工廠模式】

/**** 沒有采用工廠模式的情況下*/
package cn.sxt.pattern;public class Test_0423_Client01 {//調用者public static void main(String[] args) {Car car=new Audi();Car car2=new Byd();car.run();car2.run();    }
}

類圖:

【采用簡單工廠模式】

/**** 簡單工廠模式:用來生產同一等級結構中的任意產品(對于增加的新的產品,需要修改已有代碼)* 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)* 抽象工廠模式:用來生產不同產品族中的全部產品(對于增加新的產品,無能為力。支持增加新的產品族)
* 采用簡單工廠模式的一個工廠,如果要增加新的子類如“紅旗”類,只能修改已有的代碼 ("return null") 做修改,但是違反開閉原則*
*/ package cn.sxt.pattern;public class Test_0423_Factory {public static Car createCar(String type) {if ("奧迪".equals(type)) {return new Audi(); }else if ("比亞迪".equals(type)) {return new Byd(); }else {return null;} }//也可以采用這種方式去創建類對象所以也稱它為靜態方法 /* public static Car createAudi(){return new Audi();}public static Car createByd() {return new Byd(); }*/ }/**** 采用簡單工廠模式的情況下*/ package cn.sxt.pattern;public class Test_0423_Client02 {//調用者public static void main(String[] args) {Car car=Test_0423_Factory.createCar("奧迪");//不用直接與Audi類打交道,而是與工廠類打交道,通過調用方法new對象Car car2=Test_0423_Factory.createCar("比亞迪");car.run();car2.run(); } }

類圖:

2、工廠方法模式

【一個工廠方法接口和客戶類】

/**** 工廠方法模式:用來生產同一等級結構中的固定產品(支持增加任意產品)*/
package cn.sxt.pattern;public interface Test_0423_Factory2 {Car createCar();
}

/**** 采用工廠方法模式的情況下*/ package cn.sxt.pattern; public class Test_0423_Client03 {//調用者public static void main(String[] args) {Car car=new AudiFactory().createCar();Car car2=new BydFactory().createCar();//如果要造奔馳,那么直接增加benz.java和benzFactory.java,這樣不需要修改原有代碼,符合開閉原則。但是會增加代碼量 car.run();car2.run(); } }

【各種車型的工廠】


/**
* "奧迪"專門的工廠*/ package cn.sxt.pattern;public class AudiFactory implements Test_0423_Factory2 {public Car createCar() {return new Audi();}}/**"比亞迪"專門的工廠* */ package cn.sxt.pattern;public class BydFactory implements Test_0423_Factory2 {public Car createCar() {return new Byd();}}

類圖:

3、抽象工廠模式

? ?用來生產不同產品族的全部產品

? ?抽象工廠模式是針對產品族的情況,在多個業務品種、業務分類時,通過抽象工廠模式產生需要的對象是個很好解決辦法。

【產品族】 一個產品族:發動機、座椅、輪胎

由 高級發動機、高級座椅、高級輪胎組成一個高級產品族 ,生成一個高端汽車;

由 低級發動機、低級座椅、低級輪胎組成一個低級產品族 ,生成一個低端汽車。

【一個產品族】

/**** "發動機"接口*/
package cn.sxt.abstractFactory;public interface Engine {void run();void start();
}class LuxuryEngine implements Engine{ //"好發動機"類 public void run() {System.out.println("轉的快!");        }public void start() {System.out.println("啟動快!");            }     
}class LowEngine implements Engine{ //"差發動機"類 public void run() {System.out.println("轉的慢!");        }public void start() {System.out.println("啟動慢!");            }     
}/**** "座椅"接口*/
package cn.sxt.abstractFactory;public interface Seat {void comfortable();
}class LuxurySeat implements Seat{ //"好座椅"類 public void comfortable() {System.out.println("坐著舒服!");        }
}class LowSeat implements Seat{ //"差座椅"類 public void comfortable() {System.out.println("坐著難受!");        }    
}/**** "輪胎"接口*/
package cn.sxt.abstractFactory;public interface Tyre {void friction();
}class LuxuryTyre implements Tyre{ //"好輪胎"類 public void friction() {System.out.println("摩擦力大!");        }
}class LowTyre implements Tyre{ //"差輪胎"類 public void friction() {System.out.println("摩擦力小!");        }    
}

【工廠類】

/**** "造汽車的工廠"接口*/
package cn.sxt.abstractFactory;public interface Test_0423_Factory03 {Engine createEngine();Seat createSeat();Tyre createTyre();
}/*** //造"高端汽車"的工廠*/
package cn.sxt.abstractFactory;public class LuxuryCarFactory implements Test_0423_Factory03{ public Engine createEngine() {return new LuxuryEngine();//返回好發動機的對象
    }public Seat createSeat() {return new LuxurySeat();}public Tyre createTyre() {return new LuxuryTyre();}
}/*** //造"低端汽車"的工廠*/
package cn.sxt.abstractFactory;public class LowCarFactory implements Test_0423_Factory03{ public Engine createEngine() {//返回差發動機的對象return new LowEngine();}public Seat createSeat() {return new LowSeat();}public Tyre createTyre() {return new LowTyre();}
}

【一個客戶對象】

/**** 采用抽象工廠模式的情況下*/
package cn.sxt.abstractFactory;public class Test_0423_Client04 {//調用者public static void main(String[] args) {Test_0423_Factory03 factory=new LuxuryCarFactory();Engine engine=factory.createEngine();engine.run();engine.start();Test_0423_Factory03 factory2=new LowCarFactory();Tyre tyre=factory2.createTyre();tyre.friction();}
}

【類圖】

轉載于:https://www.cnblogs.com/ID-qingxin/p/10747583.html

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

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

相關文章

Chrome瀏覽器12px問題-webkit-text-size-adjust: none 已失效的解決方案

對于早期的chrome, 如果要想顯示12px以下的字體,一般通用的方案都是在對應的元素中添加 div {-webkit-text-size-adjust: none; }但是我今天遇到的需求,添加了之后沒有反應,而且瀏覽就根本不支持這種寫法。 在網上看到了博客《Chrome瀏覽器…

CSRFGuard工具介紹

理解CSRFGuard的基礎:http://www.runoob.com/jsp/jsp-tutorial.html 1:您需要做的第一件事是將OWASP.CSRFARGAD.JAR庫復制到類路徑中。放置Owasp.CsrfGuard.jar最常見的類路徑位置在Web應用程序的WEB-INF文件夾的lib目錄中。 OWASP CSRFGARD 3在傳統Java…

[19/04/24-星期三] GOF23_創建型模式(建造者模式、原型模式)

一、建造者模式 本質:分離了對象子組件的單獨構造(由Builder負責)和裝配的分離(由Director負責),從而可以構建出復雜的對象,這個模式適用于:某個對象的構建過程十分復雜 好處:由于構建和裝配的解耦,不同的構…

深入理解vue中的slot與slot-scope

寫在前面 vue中關于插槽的文檔說明很短,語言又寫的很凝練,再加上其和methods,data,computed等常用選項在使用頻率、使用先后上的差別,這就有可能造成初次接觸插槽的開發者容易產生“算了吧,回頭再學&#…

js 轉義

1. JavaScript 特殊字符 2. 正反斜杠互相替換 a/b/c.replace(/\//g,\\) // "a\b\c" $0.value.replace(/\\/g,\/) // a/b/c 獲取到 而不提取出 某個值后進行直接處理 \ 有轉義功能,所以一旦解析必然轉義,通常是直接獲取到數據源…

關于Java抽象類,接口與實現接口及派生類繼承基類

1. 抽象類 抽象類就是有一個或多個方法只被聲明而未被實現。 抽象方法的聲明以分號結束,并且用關鍵字abstract來說明它以標識它為抽象方法。 格式: public abstract class 類名{ 定義變量// 抽象方法// } 2. 接口是抽象類的一種,之包含常量…

ie兼容響應式布局的實現總結

雖然說響應式設計的理想狀態是,需對pc/移動各種終端進行響應;但是現實是高分辨率的pc端與手機終端屏幕相差太大,像電商這樣有大量圖片和文字 信息的同時排版要求精準的頁面,設計一個同時適應高分辨率pc又適合小尺寸的手機終端是挑…

Luogu P1471 方差

題目傳送門 開了十倍空間才過是什么鬼?該不會我線段樹炸了吧……細思極恐 平均數都會求,維護區間和,到時候除一下就好了。 方差的求法如下(用的Luogu的圖片) 因為要維護一個平方,我們可以考慮使用van♂完全平方公式將它拆開&#…

python學習day17 遞歸函數

遞歸函數 http://www.cnblogs.com/Eva-J/articles/7205734.html def age(n):if n 4:return 40elif n >0 and n < 4:return age(n1) 2print(age(1)) # 46 只要寫遞歸函數&#xff0c;必須要有結束條件。 二分法查找 l [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,5…

2018年最好用的20個Bootstrap網站模板

Bootstrap是目前最受歡迎也是最簡潔的建站方式之一&#xff0c;尤其是伴隨移動端的發展&#xff0c;響應式設計已經毫無疑問成為了網頁設計的趨勢&#xff0c;網站建設要求兼容手機端已經是一種剛需&#xff0c;也成為提升用戶體驗的一種必要方式。但這無疑會加大設計師和前端人…

bit、byte、位、字節、漢字、字符之間的區別

package com.suypower.chengyu.test; public class ByteTest { /** * byte 8 bits -128 - 127 * 1 bit 1 二進制數據 * 1 byte 8 bit * 1 字母 1 byte 8 bit(位) * 1 漢字 2 byte 16 bit */ public static void main(String[] args) { // TODO Auto-generated method st…

Android SDK 2.3/3.0/4.0/4.2 下載與安裝教程

Eclipse下搭建Android開發環境教程&#xff1a;http://dev.son1c.com/show/1253.html Google已經發布了Android SDK 4.2版本.下面給朋友們介紹一下安裝 Android 模擬器 Emulator模擬器的方法: 1、首先確定安裝了Java JDK&#xff0c;如果沒有&#xff0c;可以去http://www.ora…

PMP:4.項目整合管理

內容中包含 base64string 圖片造成字符過多&#xff0c;拒絕顯示轉載于:https://www.cnblogs.com/mapanguan/p/9916902.html

瀏覽器渲染原理與過程

一、瀏覽器如何渲染網頁 要了解瀏覽器渲染頁面的過程&#xff0c;首先得知道一個名詞——關鍵路徑渲染。關鍵渲染路徑&#xff08;Critical Rendering Path&#xff09;是指與當前用戶操作有關的內容。例如用戶在瀏覽器中打開一個頁面&#xff0c;其中頁面所顯示的東西就是當前…

css框架:五大css流行框架的總結-css教程-PHP中文網

本篇文章給大家帶來的內容是關于css框架&#xff1a;五大css流行框架的總結&#xff0c;有一定的參考價值&#xff0c;有需要的朋友可以參考一下&#xff0c;希望對你有所幫助。 如今&#xff0c;CSS框架越來越受歡迎&#xff0c;可以說已經應用到每一個網站上了。作為開發工具…

第十四天

###數組&#xff1a;面向對象的方式創建&#xff1a;var arr01 new Array(1,2,3,"abc");直接創建&#xff1a;var arr02 [1,2,3,"abc"]alert (arr02.length);alert(arr02[3]);var arr03 [[1,2,3],["a","b","c","d&q…

【English Email】CIP payouts now in Workday

simplification簡化的[?s?mpl?f??ke??n] quota配額[?kwo?t?] regional區域的[?ri?d??nl] mechanics技工[m??kn?ks] annual年度的 [?nju?l] mid-year年中 [m?d j?r] bridge橋接[br?d?] Incentive激勵 [?n?sent?v] Due to the simplification of …

爬取網頁的通用代碼框架

import requests def getHTMLText(url)try:r requests.get(url,timeout30)r.raise_for_status()r.encoding r.apparent_encodingreturn r.textexcept:return "產生異常"if__name__ "__main__"url "http://www.baidu.com"print(getHTMLText(ur…

深入理解CSS盒模型 - 程序猿的程 - 博客園

深入理解CSS盒模型 本文是學習中傳思客在慕課網開的課程《前端跳槽面試必備技巧》的學習筆記。課程地址&#xff1a;https://coding.imooc.com/class/evaluation/129.html#Anchor。 如果你在面試的時候面試官讓你談談對盒模型的理解&#xff0c;你是不是不知從何談起。這種看似…

藍橋杯——機器人行走

某少年宮引進了一批機器人小車。可以接受預先輸入的指令&#xff0c;按指令行動。小車的基本動作很簡單&#xff0c;只有3種&#xff1a;左轉&#xff08;記為L&#xff09;&#xff0c;右轉&#xff08;記為R&#xff09;&#xff0c;向前走若干厘米&#xff08;直接記數字&am…