1: 簡單工廠模式

一. 基本概念

  1. 定義
  • 實(shí)例化對象,用工廠方法代替new操作
  • 工廠模式包括工廠方法模式和抽象工廠模式
  • 抽象工廠模式是工廠方法模式的擴(kuò)展
  1. 意圖
  • 定義一個(gè)接口來創(chuàng)建對象,但是讓子類來決定那些類需要被實(shí)例化
  • 工廠方法把實(shí)例化的工作推遲到子類中去實(shí)現(xiàn)
  1. 什么情況適合工廠模式
  • 有一組類似的對象需要?jiǎng)?chuàng)建
  • 在編碼時(shí)不能預(yù)見需要?jiǎng)?chuàng)建那種類的實(shí)例
  • 系統(tǒng)需要考慮擴(kuò)展性,不應(yīng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié)
  1. 項(xiàng)目中的現(xiàn)狀:
  • 在軟件系統(tǒng)中經(jīng)常面臨著“對象”創(chuàng)建的工作,由于需求的變化,這個(gè)對象可能隨之也會(huì)發(fā)生變化,但它卻擁有比較穩(wěn)定的接口
  • 我們需要提供一種封裝機(jī)制來隔離出這個(gè)易變對象的變化,從而保持系統(tǒng)中其他依賴,該對象的對象不隨著需求的變化而變化
  1. 基于項(xiàng)目現(xiàn)狀將代碼進(jìn)行如下設(shè)計(jì):
  • 盡量松耦合,一個(gè)對象的依賴對象的變化與本身無關(guān)
  • 具體產(chǎn)品與客戶端剝離,責(zé)任分割

二. 案例

  1. calculator: 使用簡單工廠模式, 創(chuàng)建控制臺(tái)計(jì)算器
簡單工廠實(shí)現(xiàn)計(jì)算器UML類圖
  • 創(chuàng)建Calculator抽象類, 添加計(jì)算抽象方法, 添加數(shù)值屬性, get set方法
    /**
     * 計(jì)算器計(jì)算基類
     */
    public abstract class OperationAbstract {
    
        private BigDecimal number1;
    
        private BigDecimal number2;
    
        /**
         * 由子類實(shí)現(xiàn)運(yùn)算規(guī)則
         * @return
         */
        public abstract BigDecimal calculate();
    }
  • 創(chuàng)建加減乘除實(shí)現(xiàn)類
    /**
     * 加法運(yùn)算
     */
    public class Add extends OperationAbstract{
    
        @Override
        public BigDecimal calculate() {
            return this.getNumber1().add(this.getNumber2());
        }
    }
    
    /**
     * 減法運(yùn)算
     */
    public class Subtract extends OperationAbstract {
    
        @Override
        public BigDecimal calculate() {
            return this.getNumber1().subtract(this.getNumber2());
        }
    }
    
    /**
     * 乘法運(yùn)算
     */
    public class Multiply extends OperationAbstract {
    
        @Override
        public BigDecimal calculate() {
            return this.getNumber1().multiply(this.getNumber2());
        }
    }
    
    /**
     * 除法運(yùn)算
     */
    public class Divide extends OperationAbstract {
    
        @Override
        public BigDecimal calculate() {
            return this.getNumber1().divide(this.getNumber2());
        }
    }
  • 創(chuàng)建工廠類
    /**
     * 計(jì)算機(jī)靜態(tài)工廠類
     */
    public final class OperationFactory {
    
        /**
         * 獲取計(jì)算
         * @param symbol
         * @return
         */
        public static OperationAbstract createOperation (String symbol) {
            switch (symbol) {
                case SymbolConstants.ADD:
                    return new Add();
                case SymbolConstants.SUBTRACT:
                    return new Subtract();
                case SymbolConstants.MULTIPLY:
                    return new Multiply();
                case SymbolConstants.DIVIDE:
                    return new Divide();
                default:
                    throw new RuntimeException("暫不支持");
            }
        }
    
        private OperationFactory () {}
    }
  • 測試
    public static void main(String[] args) {
    
        do {
            //控制臺(tái)輸入
            Scanner scanner = new Scanner(System.in);

            //輸入3次
            BigDecimal number1 = scanner.nextBigDecimal();
            String symbol = scanner.next();
            BigDecimal number2 = scanner.nextBigDecimal();

            //通過靜態(tài)工廠獲取實(shí)例
            OperationAbstract operation = OperationFactory.createOperation(symbol);

            //放入計(jì)算數(shù)據(jù)
            operation.setNumber1(number1);
            operation.setNumber2(number2);

            //獲取返回
            BigDecimal result = operation.calculate();

            System.out.println(result);

        } while (true);
    }

三. 實(shí)例下載

GitHub: 簡單工廠模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,094評論 1 15
  • 1 場景問題# 1.1 導(dǎo)出數(shù)據(jù)的應(yīng)用框架## 考慮這樣一個(gè)實(shí)際應(yīng)用:實(shí)現(xiàn)一個(gè)導(dǎo)出數(shù)據(jù)的應(yīng)用框架,來讓客戶選擇數(shù)據(jù)...
    七寸知架構(gòu)閱讀 7,016評論 6 75
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,632評論 19 139
  • 1 場景問題# 1.1 選擇組裝電腦的配件## 舉個(gè)生活中常見的例子——組裝電腦,我們在組裝電腦的時(shí)候,通常需要選...
    七寸知架構(gòu)閱讀 4,540評論 6 67
  • 青島三面環(huán)海,碧海藍(lán)天國慶期間不想去海邊下餃子的我選擇了適合獨(dú)行的八大關(guān)雖然人頭攢動(dòng),人聲喧嘩 喜歡淺藍(lán)色的墻面,...
    Gloria丹寧閱讀 207評論 0 0

友情鏈接更多精彩內(nèi)容