シンプルなファクトリパターンデザインパターン(Java版)西方の研究ノート

二本の文字:料理や鳥
を開始する一つの話題から話:C ++やJava、C#いずれかの使用してくださいオブジェクト指向のコンソールプログラムを達成するために、言語の計算機は、結果を取得するには、二つの数と算術記号を入力するよう求めました。

次のように最初の答え料理、:

import java.util.Scanner;

public class SimpleFactoryModel {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.println("请输入数字A: ");
        double A = in.nextDouble();

        System.out.println("请选择运算符号(+ - * /): ");
        String c = in.next();

        System.out.println("请输入数字B: ");
        double B = in.nextDouble();

        double res = 0;
        
        if(c.equals("+")){
            res = A + B;
        }
        if(c.equals("-")){
            res = A - B;
        }
        if(c.equals("*")){
            res = A * B;
        }
        if(c.equals("/")){
            res = A / B;
        }
        System.out.println("结果是: " + res);
    }
}

多くの一見3つの意思に関係なく、問題の質問、ヘクタールで
名前が付けられていない規制問題:コード内に表示されるように最善ではないという名前のA、B、Cの第一位
二位を:分岐判断が問題である:4つの条件は、各裁判官がしなければならないという意味であれば、有用な作業を3回行うのコンピュータと同等の
第三位:ゼロ除算が考慮されていません

サイドディッシュは、コードを変更するには...

import java.util.Scanner;

public class SimpleFactoryModel {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try {
            System.out.println("请输入数字A: ");
            double numberA = in.nextDouble();

            System.out.println("请选择运算符号(+ - * /): ");
            String strOperate = in.next();

            System.out.println("请输入数字B: ");
            double numberB = in.nextDouble();

            double result = 0;

            switch (strOperate){
                case "+":result = numberA + numberB;break;
                case "-":result = numberA - numberB;break;
                case "*":result = numberA * numberB;break;
                case "/":
                    if(numberB!=0){
                        result = numberA / numberB;
                    }else {
                        System.out.println("除数不能为0!");
                    }break;
            }
            if(numberB!=0){
                System.out.println("结果是: " + result);
            }
        }catch (Exception e){
            System.out.println("您的输入有错:"+e.getMessage());
        }
    }
}

ビッグバード:はいはい、まあすぐにコードを変更し、それがどういう意味、このコードは、人々の話題に沿って書かれていますか?
サイドディッシュ:あなたの平均オブジェクト指向?
ビッグバード:ハハ、非植物のおかずにも!

以下の話は非常にエキサイティングで、離れて行ってはいけません!
フラグメント:三国期間の言葉、曹操も、軍用船として、で、呉、支配の世界、曹操越ので、すべての市民と軍の宴会を退治するために登場し、呉、長江レッドクリフに駐留軍を攻撃する部隊の何百万人を率い宴会場、曹操詩的な空想は、陰を感じる:歌や飲酒、人生は本当にクールですすべての市民と軍が唱え:首相の詩を!だから人生の廷臣は、印刷職人が広がり、世界に紋切り型のスピード。

フラグメントII:曹操の表情に出て証明、間違った曹操を感じるには、言った:飲み物と歌い、あまりにも下品な発言は、それがためにあるべきワインと歌より良いので、この大臣は、最初からやり直すために職人を命じました。職人の夜の仕事のステレオタイプを見て、完全に無駄で、心が絶え間なく文句を言うと、彼はそうしなければなりませんでした。

3の断片:再び証明うちは、その人生はあまりにも気分を依頼する言語十分に置き換える必要があり、あまりにも直接冷却されているので読んでください、曹操、曹操薄い製品を目を通すことは良くないと思うしてください:ワインと歌、人生のジオメトリを?廷臣たちは職人を伝えるときは、職人が気を失いました。

三国、まだない可動タイプは、あなたが単語を変更したいときに、我々はすべての再刻ま全体ステレオタイプしなければならない、ですが、可動タイプで、あなただけの単語を変更する必要があり、そして残りは何のために仕事しませんでした、だろうMiaozai!

保守性:変化に、ちょうどそれを変更する単語を変更、
再利用可能:これらの言葉は無用上に使用されていない、次の印刷に再利用することができ、
拡張可能:あなたは言葉の詩を追加したい場合は、のみ対象レタリングを追加することができ、
良好な柔軟性は:手配言葉が水平になることができ、垂直は、あなただけ入力する必要が移動することができますすることができます。

可動タイプが登場し、4上記の機能が満たされていない、あなたが変更したい、再刻まなければなりません前に、単語を追加するために、あなたは再刻まなければならず、再配置し、再刻まれなければならない。インドは本を終えた後、このバージョンはどのなくなりました再利用の価値。
古代中国、火薬、羅針盤、製紙の4つの偉大な発明は、技術の進歩であり、可動タイプはイデオロギー的な成功、オブジェクト指向の勝利です。だから、どのように再利用拡大を簡単に、維持するために簡単に書くと、簡単な電卓プログラムするには?

多重化は、コピーではない、原理はして可能な限りでのプログラミングがあり、重複を避けるために

電卓計算及び表示を分割することができる、すなわち、ビジネス・ロジックおよびインターフェースロジックは、コンピューティングビジネスクラスにパッケージされ、ディスプレイ・インターフェースから分離され、コードのビジネス端は次の通りであります:

public class Operation{
    public static double GetResult(double numberA,double numberB,String strOperate){
        double result = 0;

        switch (strOperate){
            case "+":result = numberA + numberB;break;
            case "-":result = numberA - numberB;break;
            case "*":result = numberA * numberB;break;
            case "/":result = numberA / numberB;break;
        }
        return result;
    }
}

クライアントコードは以下のように:

import java.util.Scanner;

public class SimpleFactoryModel {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        try {
            System.out.println("请输入数字A: ");
            double numberA = in.nextDouble();

            System.out.println("请选择运算符号(+ - * /): ");
            String strOperate = in.next();

            System.out.println("请输入数字B: ");
            double numberB = in.nextDouble();
            if(strOperate.equals("/") && numberB==0){
                System.out.println("请重新输入数字B(除数不能为0): ");
                numberB = in.nextDouble();
            }

            double result = Operation.GetResult(numberA,numberB,strOperate);
            System.out.println("结果是:"+result);

        }catch (Exception e){
            System.out.println("您的输入有错:"+e.getMessage());
        }
    }
}

:上記のコードは、オブジェクト指向が、唯一のオブジェクト指向1の三つの特徴使用を検討したパッケージを、継承とポリモーフィズムの他の二つの特性を適用することもできるが、それではありませんか?

サイドディッシュ:あなたはこのような小さな電卓プログラムは、オブジェクト指向の三つの特徴で使用することができます、継承し、それらを必要とするかもしれない多型が、私は本当に理解することはできませんどのように
鳥を:非常に心まあの問い合わせは、私はあなたのスキルを見てみましょうレベルを深め、あなたが最初にそれについて考える、コードは今それを修正することができ、拡張された柔軟であることができ
おかず:ビジネスとのインターフェイスは非常に柔軟まだない、うん分離された
ビッグ鳥:私はあなたが今、Aを追加したい聞いてみようあなたが変更するにはどうすればよい平方根計算(SQRT)、
おかずを:操作のみクラスを変更する必要があり、加えてスイッチに支店ができ
数学の問題があるので、プラス操作であなただけのオープンが、聞かせて:鳥操作がされているコンパイルに関与誤って加算減算に入れた場合、それはあまりにも悪くないです!比喩、同社は現在、同社の給与システム、もともとだけの技術スタッフ(給与)、販売およびマーケティングスタッフ(基本給+歩合)、管理者(給与+株)の3つの操作は、現在パートタイム労働者を増やすために、アルゴリズムを維持する必要があります(時給)アルゴリズム、あなたが前に、会社があなたの心は少し思考、TMDを破った場合、あなたが変更できるように、元のクラスは3つのアルゴリズムの動作を含んでいるあなたを与えるべき文言に従い、同社が低いので、私の給料を与え、あなたが外でパートタイムのアルゴリズムを上げるので、私は本当に技術スタッフ(給与)アルゴリズムを追加した、ああ、私はそれをあらゆる機会を取ってみましょう、落ち込んでいました

if(员工是小菜)
	salary = salary * 1.1;

これは、毎月の給与が10%増加することを意味機能を追加することであっただろう、元の実行良いコード生成が変更されていることができ、リスクが大きすぎる、あなたは理解して
おかずを:ああ、あなた私は、そのような加算、減算などの操作を分離し、他のいくつかに影響を与えることなく、1を修正し、他のコードには影響を与えない新しい動作アルゴリズムを追加する必要があり、意味、その権利である
鳥:彼らはそれが、どのように継承を使用したいと状態

次のような考え方は次のとおりです
。1.数学:

/**
 *角色:抽象产品 Product
 * 职责:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
 */
public abstract class Operation{ 
    private double numberA = 0;
    private double numberB = 0;

    public double getNumberA() {
        return numberA;
    }
    public void setNumberA(double numberA) {
        this.numberA = numberA;
    }
    public double getNumberB() {
        return numberB;
    }
    public void setNumberB(double numberB) {
        this.numberB = numberB;
    }

    public abstract double GetResult();
}

2.付加操作型クラス継承

/**
 * 角色:具体产品 Concrete Product
 * 职责:简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例
 */
public class OperationAdd extends Operation {
    @Override
    public double GetResult(){
        return getNumberA() + getNumberB();
    }
}

次のように減算、乗算、除算はカテゴリーをベースと同様のクラスがあります。

public class OperationSub extends Operation{
    @Override
    public double GetResult(){
        return getNumberA() - getNumberB();
    }
}

public class OperationMul extends Operation {
    @Override
    public double GetResult() {
        return getNumberA() * getNumberB();
    }
}

public class OperationDiv extends Operation {
    @Override
    public double GetResult() {
        return getNumberA()/getNumberB();
    }
}

3.詳細なファクトリクラスは、オブジェクトをインスタンス化する責任があります

/**
 * 角色:工厂 Creator
 * 职责:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。
 *      工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
 */
public class OperationFactory {
    public static Operation createOperate(String operate){ //operate是运算符
        Operation operation = null; //operation是实例化对象
        //只需要输入运算符号,运算类工厂就可以实例化出合适的对象,通过多态,返回父类的方式实现计算结果
        switch (operate){
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            case "@"://以@符号表示两数之和的开跟运算,在添加新的运算方式时,在case分支中要记得添加具体的实例化对象
                operation = new OperationSqrt();
                break;
        }
        return operation;
    }
}

4.クライアントコード:

/**
 * 什么是工厂:用一个单独的类来做这个类创造实例的过程,这就是工厂
 * 简单工厂模式解决了对象的创建问题
 * 在已知某些条件后,对于类的选择(这些待选择的类都是同一父类的子类)时使用简单工厂模式
 */
import java.util.Scanner;
public class SimpleFactoryModel {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        try {
            System.out.println("请输入数字A: ");
            double numberA = in.nextDouble();

            System.out.println("请选择运算符号(+ - * /): ");
            String strOperate = in.next();

            System.out.println("请输入数字B: ");
            double numberB = in.nextDouble();
            if(strOperate.equals("/") && numberB==0){
                System.out.println("请重新输入数字B(除数不能为0): ");
                numberB = in.nextDouble();
            }

            Operation operation;
            operation = OperationFactory.createOperate(strOperate); //实例化运算类
            operation.setNumberA(numberA); //确定运算数字
            operation.setNumberB(numberB);
            double result = operation.GetResult(); //调用方法得到运算结果
            System.out.println("结果是:"+result);

        }catch (Exception e){
            System.out.println("您的输入有错:"+e.getMessage());
        }
    }
}

私たちは、加算器を変更したい場合は、他の事業者は、スイッチのブランチの増加を演算子クラスの増加に対応する限り、平方根演算を高め、操作型植物を変更するのであれば、OperationAddだけで、それを変更する必要があります。
このようなサブカテゴリを増加させるために、オープンで2回の操作での数を増やすように、分岐は、前のコードに増加しています

public class OperationSqrt extends Operation {
    @Override
    public double GetResult() {
        double mul = getNumberA()+getNumberB();
        return Math.sqrt(mul);
    }
}

要約:

単純な方法インスタンス化特定のオブジェクト(操作のクラスのサブクラス)にファクトリクラスによってcreateOperateは、減算が継承である等、操作者及び依存型、操作種別と付加型との間にあります。

小さな電卓も良いコードを書くことができ、プログラミングは芸術である、それだけでビン上で適切に実行するために書かれたコードの結果に満足できない芸術であり、一つは、常にコードより簡潔かつ容易に作成する方法を検討すべきですメンテナンス、拡張が容易と再利用、真に改善するための唯一の方法。

これはちょうどそれを是非、オブジェクト指向を理解し始めています!

公開された22元の記事 ウォン称賛21 ビュー6973

おすすめ

転載: blog.csdn.net/weixin_43108122/article/details/104551007