---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
简单工厂模式:一般有一个工厂类,该类中一般有个静态方法,用于创建产品,但是该静态方法的返回值应为这些产品的父类(一般是抽象类)
应用举例:计算器中界面代码与逻辑代码的解耦,但简单工厂的内部仍然要写很多分支语句
面向对象优点:可维护、可复用、可扩展、灵活性好。
创建型模式:简单工厂模式,工厂方法模式,抽象工厂模式,单例模式,
结构型模式:适配器模式,代理模式
行为型模式:观察者模式,策略模式,模板模式
简单工厂模式:
编写一个计算器,实现加减乘除功能
eg1:
import java.util.Scanner;
public class Caculator {
public static void main(String[] args) {
int result = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个整数:");
int number1 = scanner.nextInt();
System.out.println("输入第二个整数:");
int number2 = scanner.nextInt();
System.out.println("输入一个操作数:1代表+,2代表-,3代表*,4代表/");
int operator = scanner.nextInt();
switch (operator) {
case 1:
result = number1 + number2;
break;
case 2:
result = number1 - number2;
break;
case 3:
result = number1 * number2;
break;
case 4:
result = number1 / number2;
break;
}
System.out.println(result);
}
}
这种方式使得界面和逻辑耦合太紧(从界面输入数据,输出数据到控制台属于界面层),(+-*/属于逻辑层)
(在开闭原则中一般界面层的代码是可以修改的,但逻辑层的代码原则上是扩展而不是修改)
修改:
eg2:
Operator类
package demo2;
public interface Operator {
int getresult(int number1, int number2);
}
Add 类
package demo2;
public class Add implements Operator {
@Override
public int getresult(int number1, int number2) {
// TODO Auto-generated method stub
return number1 + number2;
}
}
Subtraction 类
package demo2;
public class Subtraction implements Operator {
@Override
public int getresult(int number1, int number2) {
// TODO Auto-generated method stub
return number1 - number2;
}
}
Mutiplication 类
package demo2;
public class Mutiplication implements Operator {
@Override
public int getresult(int number1, int number2) {
// TODO Auto-generated method stub
return number1 * number2;
}
}
Division 类
package demo2;
public class Division implements Operator {
@Override
public int getresult(int number1, int number2) {
// TODO Auto-generated method stub
return number1 / number2;
}
}
Caculator 类
package demo2;
import java.util.Scanner;
public class Caculator {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int result = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个整数:");
int number1 = scanner.nextInt();
System.out.println("输入第二个整数:");
int number2 = scanner.nextInt();
System.out.println("输入一个操作数:1代表+,2代表-,3代表*,4代表/");
int operator = scanner.nextInt();
switch (operator) {
case 1:
result = new Add().getresult(number1, number2);
break;
case 2:
result = new Subtraction().getresult(number1, number2);
break;
case 3:
result = new Mutiplication().getresult(number1, number2);
break;
case 4:
result = new Division().getresult(number1, number2);
break;
}
System.out.println(result);
}
}
点评:这样做虽然符合了开闭原则,(逻辑层不需要修改,如果要增加开方算法,只要实现Operator接口即可)
修改如下:
Caculator类
package demo2;
import java.util.Scanner;
public class Caculator {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int result = 0;
Scanner scanner = new Scanner(System.in);
System.out.println("输入一个整数:");
int number1 = scanner.nextInt();
System.out.println("输入第二个整数:");
int number2 = scanner.nextInt();
System.out.println("输入一个操作数:1代表+,2代表-,3代表*,4代表/");
int operator = scanner.nextInt();
OperatorManager om = new OperatorManager();
om.setType(operator);
result = om.getResult(number1, number2);
System.out.println(result);
}
}
OperatorManager 类:
package demo2;
public class OperatorManager {
Operator operator;
int type;
public void setType(int type) {
this.type = type;
}
public int getResult(int number1, int number2) {
int result = 0;
switch (type) {
case 1:
operator = new Add();
break;
case 2:
operator = new Subtraction();
break;
case 3:
operator = new Mutiplication();
break;
case 4:
operator = new Division();
break;
}
result = operator.getresult(number1, number2);
return result;
}
}
其他类与上面类似
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------