简单工厂模式

定义:   简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

解决问题:解决如何实例化对象的问题,根据不同的场景实例化不同的对象

核心思想:用一个专门的类来进行对象的实例

特性:封装、多态

特点:易维护、易扩展、易复用

结构图

包含的角色:

       工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。

       抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。

       具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。

在具体使用过程中,需求判断具体产品是否有相同的逻辑,没有则使用接口扮演抽象产品的角色,如果有共同的逻辑部分,则使用抽象类进行,共同的东西应该要抽取出来的。

使用场景及代码实现:

需求:实现一个简单的计算器

具体分析:计算器包含有加、减、乘、除,可以抽象为一个操作类,每个具体继承操作类,进行各自具体操作的实现。最主要的核心问题就是实例不同的操作对象,所有用到简单工厂模式。

工厂角色:

public class OperationFactory {
	public static Operation createFactory(String operator) {
		Operation operation = null;
		switch (operator) {
		case "+":
			operation =  new OperationAdd();
			break;
		case "-":
			operation =  new OperatinSub();
			break;
		case "*":
			operation =  new OperationMul();
			break;
		case "/":
			operation =  new OperatinDiv();
			break;			
		default:
			break;
		}
		return operation;
	}
}

抽象角色:

public class Operation {
	private double numberA;
	private double numberB;
	public double getNumberA() {
		return numberA;
	}
	public void setNumberA(double numberA) {
		this.numberA = numberA;
	}
	public double getNumberB() {
		return numberB;
	}
	public void setNumberB(double numberB) {
		this.numberB = numberB;
	}
	
	public double result() {
		double result = 0;
		return result;
	}
}

具体角色:

public class OperationAdd extends Operation{//加
	@Override
	public double result() {
		return getNumberA()+getNumberB();
	}
}
public class OperationMul extends Operation{//乘
	@Override
	public double result() {
		// TODO Auto-generated method stub
		return getNumberA()*getNumberB();
	}
}
public class OperatinDiv extends Operation{//除
	@Override
	public double result() {
		return getNumberA()/getNumberB();
	}
}
public class OperatinSub extends Operation{//减
	@Override
	public double result() {
		// TODO Auto-generated method stub
		return getNumberA()-getNumberB();
	}
}

测试代码:

public class SimpleFactoryTest {
	public static void main(String[] args) {
		double numberA = 0;
		double numberB = 0;
		String operate = null;
		
		System.out.println("请输入numberA:");
		Scanner scanner = new Scanner(System.in);
		if(scanner.hasNextDouble()) {
			numberA = scanner.nextDouble();
		}
		Scanner scanner1 = new Scanner(System.in);
		System.out.println("请输入操作符:+,-,*,/:");
		if (scanner1.hasNextLine()) {
			operate = scanner1.nextLine();
		}	
		
		Scanner scanner2 = new Scanner(System.in);
		System.out.println("请输入numberB:");
		if(scanner2.hasNextDouble()) {
			numberB = scanner2.nextDouble();
		}
		Operation operation = OperationFactory.createFactory(operate);
		operation.setNumberA(numberA);
		operation.setNumberB(numberB);
		System.out.println(operation.result());
	}
}

注:案例出自《大话设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值