黑马程序员-设计模式之简单工厂模式(引入)

---------------------- <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>、期待与您交流! ----------------------

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值