小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

設(shè)計(jì)模式 | 工廠方法模式(factory method)

 Coder編程 2021-08-19

定義:

定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其子類。

結(jié)構(gòu):(書(shū)中圖,侵刪)

一個(gè)工廠的抽象接口
若干個(gè)具體的工廠類
一個(gè)需要?jiǎng)?chuàng)建對(duì)象的抽象接口
若干個(gè)所需創(chuàng)建的對(duì)象的類
 
較之簡(jiǎn)單工廠方法,多了一層抽象——將工廠也抽象了;由原來(lái)的一個(gè)萬(wàn)能工廠變?yōu)楝F(xiàn)在的若干個(gè)各司其職的工廠。
 
導(dǎo)致的結(jié)果就是:原本新增一個(gè)要?jiǎng)?chuàng)建的對(duì)象需要直接修改萬(wàn)能工廠類,增加判斷,違反了開(kāi)放-封閉原則;
現(xiàn)在工廠相關(guān)代碼不用改,只需要新增工廠類即可,同時(shí)將判斷轉(zhuǎn)移給了客戶端。

實(shí)例:

既然是和簡(jiǎn)單工廠相對(duì)比,就還是延用之前計(jì)算器的例子:(同樣,為了代碼簡(jiǎn)潔不考慮輸入不合法等代碼健壯性)
抽象工廠接口:
package designpattern.factorymethod;

import designpattern.staticfactorymethod.Calculate;

public interface CalculateFactory {
    Calculate create();
}
若干工廠接口:
package designpattern.factorymethod;

import designpattern.staticfactorymethod.Calculate;
import designpattern.staticfactorymethod.Plus;

public class PlusFactory implements CalculateFactory{

    @Override
    public Calculate create() {
        return new Plus();
    }

}
package designpattern.factorymethod;

import designpattern.staticfactorymethod.Calculate;
import designpattern.staticfactorymethod.Minus;

public class MinusFactory implements CalculateFactory {

    @Override
    public Calculate create() {
        return new Minus();
    }

}

package designpattern.factorymethod;

import designpattern.staticfactorymethod.Calculate;
import designpattern.staticfactorymethod.Multiply;

public class MultiplyFactory implements CalculateFactory {

    @Override
    public Calculate create() {
        return new Multiply();
    }

}
package designpattern.factorymethod;

import designpattern.staticfactorymethod.Calculate;
import designpattern.staticfactorymethod.Divide;

public class DivideFactory implements CalculateFactory {

    @Override
    public Calculate create() {
        return new Divide();
    }

}

抽象計(jì)算類及若干具體計(jì)算類:(延用之前簡(jiǎn)單工廠方法的代碼)
抽象類:
package designpattern.staticfactorymethod;

public abstract class Calculate {
    public double num1;
    public double num2;

    Calculate() {
    }

    Calculate(double num1, double num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public abstract double calculate();
}

加:

package designpattern.staticfactorymethod;

public class Plus extends Calculate {
    public Plus() {
    }

    Plus(double num1, double num2) {
        super(num1, num2);
    }

    @Override
    public double calculate() {
        return num1 + num2;
    }

}
package designpattern.staticfactorymethod;

public class Minus extends Calculate {
    public Minus() {
    }

    Minus(double num1, double num2) {
        super(num1, num2);
    }

    @Override
    public double calculate() {
        return num1 - num2;
    }

}
package designpattern.staticfactorymethod;

public class Multiply extends Calculate {
    public Multiply() {
    }

    Multiply(double num1, double num2) {
        super(num1, num2);
    }

    @Override
    public double calculate() {
        return num1 * num2;
    }

}
package designpattern.staticfactorymethod;

public class Divide extends Calculate {
    public Divide() {
    }

    Divide(double num1, double num2) {
        super(num1, num2);
    }

    @Override
    public double calculate() {
        return num1 / num2;
    }

}
客戶端:
package designpattern.factorymethod;

import java.util.Scanner;

import designpattern.staticfactorymethod.Calculate;

public class Client {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("請(qǐng)輸入一個(gè)數(shù)字");
        double num1 = scanner.nextDouble();
        System.out.println("請(qǐng)輸入一個(gè)運(yùn)算符:+、-、*、/");
        String operator = scanner.next();// 不能用nextLine(),會(huì)把上一個(gè)回車給吸收
        System.out.println("請(qǐng)輸入一個(gè)數(shù)字");
        double num2 = scanner.nextDouble();
        CalculateFactory calculateFactory = null;

        switch (operator) {
        case "+":
            calculateFactory = new PlusFactory();
            break;
        case "-":
            calculateFactory = new MinusFactory();
            break;
        case "*":
            calculateFactory = new MultiplyFactory();
            break;
        case "/":
            calculateFactory = new DivideFactory();
            break;
        default:
            break;
        }
        Calculate calculate = calculateFactory.create();
        calculate.num1 = num1;
        calculate.num2 = num2;
        System.out.println(calculate.calculate());
        scanner.close();
    }
}

總結(jié):

工廠方法模式就是在簡(jiǎn)單工廠方法模式的基礎(chǔ)上進(jìn)一步抽象,使其符合開(kāi)放-封閉原則。
個(gè)人理解,在輕量級(jí)系統(tǒng),或者工廠所能創(chuàng)建的東西較少可能修改的情況下,可以考慮使用簡(jiǎn)單工廠模式;
否則,需要使用工廠方法模式。

 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多