使用工廠模式解決設計問題

工廠設計模式是面向對象環境中最常用的模式之一。 再次來自“創意設計”模式類別,即有關對象創建的所有信息。

在某些情況下,對象的創建很復雜,可能需要某種程度的抽象,以便客戶端代碼無法意識到這些復雜性和內部實現細節。 在某些情況下,對象的創建在代碼的各個部分中是分散的和重復的。Factory模式通過定義一個接口專門解決了該問題,這些接口專門創建對象,但為實現類提供了靈活性,可以決定實例化哪個類。

定義:
Factory方法模式是定義用于創建對象的接口,但將對象創建委托給子類。

目的:
查看問題陳述,目標應該是:

  • 客戶端應該不知道對象實例化
  • 客戶端應通過公共接口訪問對象。
你知道嗎?
工廠方法設計模式通常與裝飾器設計模式一起用于各種框架(例如Struts,Spring,Apache)中。 有許多基于此Factory模式的J2EE模式,例如DAO模式。

工廠模式使用哪種面向對象設計原理?

封裝:因為它封裝了來自客戶端的創建代碼。 顯然,您可以認為封裝的好處也適用于這種模式,例如松耦合和內聚。

實際示例:

考慮一個服裝工廠,該工廠生產各種類型的服裝,例如襯衫,褲子。 消費者可以通過工廠索要所需的服裝類型。 但是,從消費者的角度來看,他們完全不知道是誰在創建此對象。 他們只是知道工廠正在為他們提供所需的服裝。

問題陳述:

一種標準做法是通過調用“ new”關鍵字來創建對象。 設想一個場景,在客戶端類中有多種情況,我們調用了多個新關鍵字來創建新對象。

if (selection.equalsIgnoreCase("Trouser")) {return new Trouser();} else if (selection.equalsIgnoreCase("Shirt")) {return new Shirt();}

如果現在必須添加外套或毛衣,則必須繼續修改客戶端代碼,并進一步添加new關鍵字。 這將導致對客戶端代碼的依賴,從而使其難以維護。

另一個問題是客戶端應用程序必須知道有多少種具體的類可以使用。 以后,如果我們必須添加另一個具體類,例如毛衣或夾克,則必須更改并重新編譯客戶代碼。

解:
為了解決上述問題,可以顯式使用工廠模式。

  • 使用Factory類可以解決訪問太多新關鍵字的第一個問題。
  • 第二個問題可以通過使用具體類將實現的接口來解決,并且客戶端將始終指向該接口類而不是具體類。 因此,通過這種方式,客戶將完全不知道所需的各種類型的具體類。
什么是接口?
Java中的接口是沒有實現的方法定義的集合。 實現接口的類必須提供實現,并且必須實現接口中描述的所有方法。 接口是一個契約,它告訴類要做什么,讓類決定如何實現它們。
interface Bounceable {void setBounce();
}

下面的類圖將全面概述Factory Pattern的實現:

工廠模式類圖

讓我們看一下實現工廠模式的示例代碼:

GarmentType.java
public interface GarmentType {String print();
}
Trouser.java
public class Trouser implements GarmentType {@Overridepublic String print() {System.out.println("Trouser Created");return "Trouser";}}
Shirt.java
public class Shirt implements GarmentType {@Overridepublic String print() {System.out.println("Shirt Created");return "Shirt";}
}
GarmentFactory.java
public class GarmentFactory {public static GarmentType createGarments(String selection) {if (selection.equalsIgnoreCase("Trouser")) {return new Trouser();} else if (selection.equalsIgnoreCase("Shirt")) {return new Shirt();}throw new IllegalArgumentException("Selection doesnot exist");}
}
客戶端程序
public class Client {public static void main(String[] args) {System.out.println("Enter your selection:");BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String selection = null;try {selection = br.readLine();} catch (IOException e) {e.printStackTrace();}GarmentType objGarmentType = GarmentFactory.createGarments(selection);System.out.println(objGarmentType.print());}
}

工廠模式的優勢:

a)此客戶端不需要了解需要創建的對象的子類。 它需要引用接口和工廠對象。
b)對象創建過程從客戶端帶到工廠,從而使客戶端代碼與對象創建代碼脫鉤。 反過來,這將有助于重用,因為此代碼可被其他客戶端使用。 c)Factory模式還有助于提高應用程序的可伸縮性,因為客戶端代碼僅引用接口,我們可以添加更多實現該接口的產品而無需在客戶端代碼中進行很多更改。 d)如果應用程序使用Factory模式(因為對象創建是集中的),則代碼可維護性是有益的。

參考: 通過 Idiotechie博客上的JCG合作伙伴 Mainak Goswami 使用Factory Pattern解決設計問題 。


翻譯自: https://www.javacodegeeks.com/2012/07/solve-design-problems-using-factory.html

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

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

相關文章

103. Binary Tree Zigzag Level Order Traversal

二刷。 BFS,基本習慣上用Iterative的做法來做,就是QUEUE。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ public class Solution…

java多線程系列13 設計模式 Future 模式

Future 模式 類似于ajax請求 頁面異步的進行后臺請求 用戶無需等待請求的結果 就可以繼續瀏覽或者操作 核心就是:去除了主函數的等待時間,并使得原本需要等待的時間段可以用于處理其他業務邏輯 JDK內置實現Future模式演示一下 public class RealData im…

lodop轉到其他html頁面,Lodop實現打印功能

思路:1、在 html 頁面引入 LodopFuncs.js 文件,并用 object 標簽和 embed 標簽獲取 lodop 對象2、在 js 中獲取 html 頁面中的 object 和 embed 對象,并使用getLodop() 方法得到 lodop 對象3、實現打印功能,以下三步是必需的初始化…

完整的Web應用程序Tomcat JSF Primefaces JPA Hibernate –第3部分

Primefaces AutoComplete,JSF轉換器 這篇文章從第一部分和第二部分繼續。 JSF擁有Converter工具,可以幫助我們從用戶視圖中獲取一些數據并將其轉換為從數據庫或緩存中加載的對象。 在“ com.converter”包中,創建以下類: packa…

html5首屏加載樂山暴雨,發布前端項目時因chunk-vendors過大導致首屏加載太慢,Vue Build時chunk-vendors的優化方案...

這個優化是兩方面的,前端將文件打包成.gz文件,然后通過nginx的配置,讓瀏覽器直接解析.gz文件。1、compression-webpack-plugin插件打包.gz文件安裝插件npm install --save-dev compression-webpack-plugin或者yarn add compression-webpack-p…

width:100vh與min-height:calc(100vh + 51px)

vh:相對于視窗的高度,那么vw:則是相對于視窗的高度。 “視區”所指為瀏覽器內部的可視區域大小,即window.innerWidth/window.innerHeight大小,不包含任務欄標題欄以及底部工具欄的瀏覽器區域大小。 詳細vh的用法,大家可以參考http…

XML配置文件中的Spring配置文件

我的上一個博客非常簡單,因為它涵蓋了我從Spring 3.0.x到Spring 3.1.x的輕松升級,最后我提到可以將Spring模式升級到3.1,以利用Spring的最新功能。 在今天的博客中,我將介紹這些功能中最酷的功能之一:Spring配置文件。…

交大計算機專業怎樣,計算機專業高校實力排名,上海交大第五,清華第二,第一毫無爭議...

原標題:計算機專業高校實力排名,上海交大第五,清華第二,第一毫無爭議計算機專業在近幾年可謂是“大熱”,眾多考生搶破頭也想當碼農,背后的原因其實不難理解。互聯網時代的到來,計算機早已滲透到…

python_day7 綁定方法與非綁定方法

在類中定義函數如果 不加裝飾器 則默認 為對象作為綁定方法 如果增加 classmethod 是 以 類 作為綁定方法 增加 classmethod 是 非綁定方法,就是不將函數 綁定 ##################### class Foo: def func(self): print(self) classmethod def func…

Spring Security使用Hibernate實現自定義UserDetails

大多數時候,我們將需要在Web應用程序中配置自己的安全訪問角色。 這在Spring Security中很容易實現。 在本文中,我們將看到最簡單的方法。 首先,我們將在數據庫中需要以下表格: CREATE TABLE IF NOT EXISTS mydb.security_role (…

python之路-面向對象

編程范式 編程是 程序 員 用特定的語法數據結構算法組成的代碼來告訴計算機如何執行任務的過程 , 一個程序是程序員為了得到一個任務結果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現一個任務的方式有很多種不同的方式, 對這…

西安郵電大學計算機科學與技術有專碩嗎,2020年西安郵電大學計算機學院考研擬錄取名單及排名!...

20考研復試調劑群:4197552812020年西安郵電大學計算機學院碩士研究生招生復試成績及綜合排名各位考生:現將我院2020年碩士研究生招生復試成績及綜合排名公布(最終錄取名單及新生學籍注冊均以“全國碩士研究生招生信息公開平臺”備案信息為準)&#xff0c…

用Java排序的五種有用方法

Java排序快速概述: 正常的列表: private static List VEGETABLES Arrays.asList("apple", "cocumbers", "blackberry");Collections.sort(VEGETABLES);output: apple, blackberry, cocumbers反向排序: pri…

[python]-數據科學庫Numpy學習

一、Numpy簡介: Python中用列表(list)保存一組值,可以用來當作數組使用,不過由于列表的元素可以是任何對象,因此列表中所保存的是對象的指針。這樣為了保存一個簡單的[1,2,3],需要有3個指針和三個整數對象。對于數值運…

檢測一個點, 是否在一個半圓之內的方法

demo: http://jsbin.com/lihiwigaso 需求: 一個圓分成分部分, 鼠標滑上不同的區域顯示不同的顏色 思路: 先判斷這個點是否在圓之內, 再判斷是否在所在的三角形之內就可以了 所需要的全部源碼: <!DOCTYPE html> <html> <head><meta charset"utf-8&quo…

計算機網絡設備接地規范,網絡機房防雷接地的四種方式及靜電要求

編輯----河南新時代防雷由于計算機網絡系統的核心設備都放置在網絡機房內&#xff0c;因而網絡機房防雷接地有了較高的環境要求&#xff0c;良好的接地系統是保證機房計算機及網絡設備安全運行&#xff0c;以及工作人員人身安全的重要措施。直流地的接法通常采用網格地&#xf…

抓住尾部的StackOverFlowError

使用Java程序時可能要處理的一種更煩人的情況是StackOverFlowError&#xff0c;如果您有一個很好的可生產的測試用例&#xff0c;那么關于使用堆棧大小或設置條件斷點/某種痕跡 。 但是&#xff0c;如果您有一個測試案例可能一次失敗100次&#xff0c;或者像我的案例一樣在AWTM…

Gunicorn配置部分的翻譯

寫在前面&#xff0c;雖然翻譯得很爛&#xff0c;但也是我的勞動成果&#xff0c;轉載請注明出處&#xff0c;謝謝。 Gunicorn版本號19.7.1 Gunicorn配置 概述 三種配置方式 優先級如下&#xff0c;越后的優先級越大 1.框架的設置&#xff08;現在只有paster在用這個&#xff0…

臺式計算機風扇聲音大怎么處理,如何解決電腦電源風扇聲音大的問題?

現在的臺式機一般用3到5年后&#xff0c;一些問題自然也就慢慢表現出來了。很多網友在使用電腦過程中都有電腦風扇聲音大怎么辦的問題&#xff0c;電腦風扇聲音大就會讓人覺得使用電腦很不舒服&#xff0c;怎么辦好呢&#xff1f;出現重要的問題要如何解決好呢&#xff1f;現在…

jsp分頁功能

http://blog.csdn.net/xiazdong/article/details/6857515轉載于:https://www.cnblogs.com/Baronboy/p/6112403.html