简单工厂模式

发布于:2024-04-03 ⋅ 阅读:(143) ⋅ 点赞:(0)

1.1 面试受挫

package com.lhx.design.pattern.test;

import java.util.Scanner;

public class Test {

	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

		Scanner sc = new Scanner(System.in);

		System.out.println("请输入数字A:");	
		String A = sc.nextLine();
		System.out.println("请选择运算符号(+、-、*、/):");	
		String B = sc.nextLine();
		System.out.println("请输入数字B:");	
		String C = sc.nextLine();
		double D = 0d;

		if (B.equals("+"))
            D = Double.parseDouble(A) + Double.parseDouble(C);
        if (B.equals("-"))
            D = Double.parseDouble(A) - Double.parseDouble(C);
        if (B.equals("*"))
            D = Double.parseDouble(A) * Double.parseDouble(C);
        if (B.equals("/"))
            D = Double.parseDouble(A) / Double.parseDouble(C);

		System.out.println("结果是:"+D);	

		System.out.println();		

		System.out.println("**********************************************");

	}
}

1.2 初学者代码毛病

上面的代码有很多不足需要改进

1.3 代码规范

package com.lhx.design.pattern.test;

import java.util.Scanner;

public class Test {

	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

		try {
			Scanner sc = new Scanner(System.in);

			System.out.println("请输入数字A:");	
			double numberA = Double.parseDouble(sc.nextLine());
			System.out.println("请选择运算符号(+、-、*、/):");	
			String strOperate = sc.nextLine();
			System.out.println("请输入数字B:");	
			double numberB = Double.parseDouble(sc.nextLine());
			double result = 0d;

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

			System.out.println("结果是:"+result);	
		}
		catch(Exception e){
			System.out.println("您的输入有错:"+e.toString());	
		}

		System.out.println();		

		System.out.println("**********************************************");

	}
}

1.5 活字印刷,面向对象

火药、指南针、造纸术都是从悟道有,从未知到发现的伟大发明,而活字印刷仅仅从刻版印刷到活字印刷仅仅是刻板印刷到活字印刷的一次技术的进步。

1.6 面向对象的好处

代码就应该易维护,灵活性,易扩展,复用

1.7 复制vs.复用

复制不是复制粘贴,代码中不应该有很多复制的代码,维护性很差,尽可能地去避免重复

1.8 业务的封装

让业务逻辑与界面逻辑分开,让它们之间的耦合度降低。只有分离开,才可以达到容易维护或者扩展。

package com.lhx.design.pattern.test;

public class Operation {
    public static double getResult(double numberA, 
        double numberB, String operate) {
        double result = 0d;
        switch (operate) {
            case "+":
                result = numberA + numberB;
                break;
            case "-":
                result = numberA - numberB;
                break;
            case "*":
                result = numberA * numberB;
                break;
            case "/":
                result = numberA / numberB;
                break;
            case "pow":
                result= Math.pow(numberA,numberB);
                break;
        }
        return result;
    }
}
package com.lhx.design.pattern.test;

import java.util.Scanner;

public class Test {

	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

		try {
			Scanner sc = new Scanner(System.in);

			System.out.println("请输入数字A:");	
			double numberA = Double.parseDouble(sc.nextLine());
			System.out.println("请选择运算符号(+、-、*、/):");	
			String strOperate = sc.nextLine();
			System.out.println("请输入数字B:");	
			double numberB = Double.parseDouble(sc.nextLine());
			
			double result = Operation.getResult(numberA,numberB,strOperate);

			System.out.println("结果是:"+result);	
		}
		catch(Exception e){
			System.out.println("您的输入有错:"+e.toString());	
		}

		System.out.println();
		System.out.println("**********************************************");

	}
}

1.9 紧耦合vs.松耦合

让你加一个功能,不能影响原有的运行良好的功能产生了变化

package com.lhx.design.pattern.test;

public class Add extends Operation {

    public double getResult(double numberA, double numberB){
        return numberA + numberB;
    }
    
}
package com.lhx.design.pattern.test;

public class Sub extends Operation {
    public double getResult(double numberA, double numberB){
        return numberA - numberB;
    }
}
package com.lhx.design.pattern.test;

public class Mul extends Operation {
    public double getResult(double numberA, double numberB){
        return numberA * numberB;
    }
}

package com.lhx.design.pattern.test;

public class Div extends Operation {
    public double getResult(double numberA, double numberB){
        if (numberB == 0){
            System.out.println("除数不能为0");
            throw new ArithmeticException();
        }
        return numberA / numberB;
    }
}
package com.lhx.design.pattern.test;

public abstract class Operation {

    public double getResult(double numberA, double numberB){
        return 0d;
    }
    
}

1.10 简单工厂模式

package com.lhx.design.pattern.test;

public class OperationFactory {

    public static Operation createOperate(String operate){
        Operation oper = null;
        switch (operate) {
            case "+":
                oper = new Add();
                break;
            case "-":
                oper = new Sub();
                break;
            case "*":
                oper = new Mul();
                break;
            case "/":
                oper = new Div();
                break;
        }
        return oper;
    }
    
}
package com.lhx.design.pattern.test;

import java.util.Scanner;

public class Test {

	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

		try {
			Scanner sc = new Scanner(System.in);

			System.out.println("请输入数字A:");	
			double numberA = Double.parseDouble(sc.nextLine());
			System.out.println("请选择运算符号(+、-、*、/):");	
			String strOperate = sc.nextLine();
			System.out.println("请输入数字B:");	
			double numberB = Double.parseDouble(sc.nextLine());
			
			Operation oper = OperationFactory.createOperate(strOperate);
			
			double result = oper.getResult(numberA,numberB);

			System.out.println("结果是:"+result);	
		}
		catch(Exception e){
			System.out.println("您的输入有错:"+e.toString());	
		}

		System.out.println();
		System.out.println("**********************************************");

	}
}

1.11 UML类图

来自于《大话设计模式》【Java溢彩加强版】作者:程杰


网站公告

今日签到

点亮在社区的每一天
去签到