Java的23种设计模式

本文最后更新于:2023年4月2日 晚上

原文链接:IRIS与Caché的23种设计模式 | InterSystems Developer Community | Caché|InterSystems

原文是COS版的设计模式,这里纯属学习设计模式思想。

第一章 Java设计模式 简单工程模式

定义

  • 简单工厂模式属于创建型模式,又可称为静态工厂模式,这是由一个工厂对象决定创建出哪一种产品类的实例

比如:衣服工程只生产衣服,食物工厂只生产食物,再具体一点就是手机工厂只生产手机

使用场景

  • 工厂类负责创建的对象比较少
  • 客户只需知道传入工厂类的参数,而无须关心创建对象的逻辑

优点

  • 使用户根据参数获得对一个的类实例,避免了直接实例化类型,降低了耦合性
  • 能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类:客户类往往有多个,如果不使用简单工厂,那么所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,所有的客户类都要进行修改

缺点

  • 可实例化的类型在编译期间已经被确定。
  • 如果增加新类型,则需要修改工厂,这违背了开放封闭原则(对扩展开放,对修改关闭)
  • 子类过多不适合使用

示例

  • 用Java实现一个计算器控制台程序,要求输入两个数和运算符号。

可能会写成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class SimpleFactory {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入第一个数字:");
int a = scanner.nextInt();
System.out.println("输入操作符:");
String operation = scanner.next();
System.out.println("输入第二个数字:");
int b = scanner.nextInt();

int result = 0;
if (operation.equals("+")) {
result = a + b;
} else if (operation.equals("-")) {
result = a - b;
} else if (operation.equals("*")) {
result = a * b;
} else if (operation.equals("/")) {
result = a / b;
}

System.out.println("计算结果为:" + result);
}
}

缺点:

  1. if表达式每次都需要判断,等于计算机做了三次无用功。
  2. 如果除法,输入了0,除法会报错。
1
2
3
4
5
6
7
8
9
10
输入第一个数字:
5
输入操作符:
/
输入第二个数字:
0
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.lawrence.designpattern.createtype.SimpleFactory.main(SimpleFactory.java:30)

Process finished with exit code 1
  • 如果改成swtich()

可能会写成这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public String GetResult() {
Scanner scanner = new Scanner(System.in);
System.out.println("输入第一个数字:");
int a = scanner.nextInt();
System.out.println("输入操作符:");
String operation = scanner.next();
System.out.println("输入第二个数字:");
int b = scanner.nextInt();

int result = 0;
switch (operation) {
case "+" :
result = a + b;
break;
case "-" :
result = a - b;
break;
case "*" :
result = a * b;
break;
case "/" :
result = a / b;
break;
}
return String.valueOf(result);
}

Java的23种设计模式
http://qingyux.cn/2022/12/25/Java的23种设计模式/
作者
青玉
发布于
2022年12月25日
许可协议