Java设计模式——工厂模式

Java设计模式——工厂模式

为了更好地理解工厂模式,我运用计算器代码作为一个例子

整体结构:

Java设计模式——工厂模式_第1张图片

Operator类

package day3.calculator;

public abstract class Operator {
     
/*
首先要理解什么是Operator类:(以下为个人想法)
Operator类是一个运算类,这个运算可以是加可以是减,所以它的结果是不确定的,所以应该把它定为抽象类,可以根据具体情况来决定把它具体成为什么样子。
*/
	private double num1;
	private double num2;
	public Operator(double num1, double num2) {
     
		super();
		this.num1 = num1;
		this.num2 = num2;
	}
	/*
	 * 在没有自己写构造函数的时候,系统就自己提供了一个无参构造函数,
	 * 但是如果自己写了无参构造函数,则系统就不会提供无参构造函数,
	 * 此时,如果想要无参构造函数,则需要自己再补充一个无参构造函数。
	 */
	public Operator() {
     
		this.num1=getNum1();
		this.num2=getNum2();
	}
	public double getNum1() {
     
		return num1;
	}
	public void setNum1(double num1) {
     
		this.num1 = num1;
	}
	public double getNum2() {
     
		return num2;
	}
	public void setNum2(double num2) {
     
		this.num2 = num2;
	}
	public abstract double getResult() ;
}

Add类和Sub类:

Add类
package day3.calculator;
/*
*为什么要继承Operator类?
*因为他们之间存在父子关系,加法也是运算方法的一种。
*/
public class Add extends Operator {
     
	public double getResult() {
     
		return getNum1()+getNum2();
	}
}
Sub类
package day3.calculator;
public class Sub extends Operator {
        

	public double getResult() {
     
		return getNum1()-getNum2();
	}
}

OperatorFactory类

package day3.calculator;
public class OperatorFactory {
     
	
	public static  Operator getOperator(String str) {
       //要加static,可以直接通过类名.方法引用,而不要创建对象
		Operator operator =null;   //为什么放在上面不行?
		switch (str) {
     
		case "+":  //此处有一个小的细节,如果str是String类型 则用"" ,如果str是char 则用''
			operator=new Add();
			break;
		case "-":
			operator=new Sub();
			break;
		default:
			System.out.println("wrong");			
			break;
		}
		return operator;
	}
	
}

Test 类

package day3.calculator;
import java.util.Scanner;
public class Test {
     
	public static void main(String[] args) {
     
		Scanner sc=new Scanner(System.in);
		double num1;
		double num2;
		String str;  
		System.out.println("请输入一个数");
		num1=sc.nextDouble();
		System.out.println("请输入宁一个数");
		num2=sc.nextDouble();
		System.out.println("请输入操作符");
		str=sc.next();
		/*
		此处就体现了面向对象的原则,此时,因为不知道接下来是什么运算,所以要面向对象,面向即将要进行的操作。
		*/
	    Operator  operator=OperatorFactory.getOperator(str);
	    /*
	    所以此处有str确定要建立的对象是Add还是Sub
	    */
	    operator.setNum1(num1);
	    operator.setNum2(num2);
	    /*
	    然后将对象赋值
	    */
	    System.out.println(operator.getResult());
	}
}

涉及到的一些问题

1.就是子类继承父类构造函数的问题
    我对于这个做了一些简略的概况

Java设计模式——工厂模式_第2张图片

      注:如果一个类写了构造函数,那么系统不再提供默认的无参构
         造函数,此时,如果想调用无参构造函数,则需要自己添加。
2.类前加static的作用

很多新手可能疑问,为什么有些类前面要加个static呢?
其实原因很简单,有时候我们要调用这个类,可是我们并不想把它实例化,此时就可以在前面加一个static,这样就可以直接通过 :类名.方法名()直接调用。

3.工厂模式的意义

就以我们这个计算器程序为例:
什么是工厂模式:
工厂模式让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。在我们这个程序中,我们由OperatorFactory类确定实例化哪一种运算(此处是通过switch语句确定是实例化加法类还是减法类,而不是在Test主类中实例化)。
好处:客户端的压力较小,客户端不需要做创建实例的操作,只需要调用工厂类中的方法就可以获得对应实例
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

4.待解决的问题

Java设计模式——工厂模式_第3张图片
原因:静态类只能调用静态属性,如果放在上面,他不是这个类的静态属性,不能调用。

最后感想:
很多时候,我们只看代码,觉得我们都会了,但是静下心来整理一下,发现,自己还是有很多模糊的地方,需要不断的查找资料弄清之间的关系。
刚学习不久,对它的认识还不够,仍有未解决的问题,明天咨询一下老师,再补上吧。

你可能感兴趣的:(设计模式,java,编程语言)