前言
本系列设计模式的整理总结来自于《大话设计模式》的学习笔记,由于它采用的是C#语言,本人将它用Java语言来实现,进而更好的让新手们进行学习。
简单工厂模式
一、介绍
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
1、角色:
工厂角色(Creator):这是简单工厂模式的核心,由它负责创建所有的类的内部逻辑。当然工厂类必须能够被外界调用,创建所需要的产品对象。
抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色:简单工厂所创建的具体实例对象,这些具体的产品往往都拥有共同的父类。
2、解决问题:如何去实例化一个合适的对象
3、思路:使用一个工厂类根据不同的需求来专门负责创建具体产品
二、实现
实例:做一个加法计算器,这个我想很多人都觉得很简单,写个加法类或者方法就行。但是这样的做法却需要用户去创建实例或者调用方法。现在流行懒人经济,人们都不喜欢做麻烦的事情。所以,我们需要一个工厂来帮用户实例化不同的运算类。这样用户只需要输入“+-x/”就可以计算了。以后如果要添加功能,就可以在工厂类中添加判断条件以及添加一个功能类。用户尽管用就好了。
1、运算类接口
public interface Operation {
public double getResult(double numberA, double numberB);
}
2、各种产品功能类类实现运算类接口
/**
* 加法
* @author Administrator
*
*/
class OperationAdd implements Operation {
public double getResult(double numberA, double numberB) {
double result = 0;
result = numberA + numberB;
return result;
}
}
/**
* 减法
* @author Administrator
*
*/
class OperationSub implements Operation {
public double getResult(double numberA, double numberB) {
double result = 0;
result = numberA - numberB;
return result;
}
}
/**
* 乘法
* @author Administrator
*
*/
class OperationMul implements Operation {
public double getResult(double numberA, double numberB) {
double result = 0;
result = numberA * numberB;
return result;
}
}
/**
* 除法
* @author Administrator
*
*/
class OperationDiv implements Operation {
public double getResult(double numberA, double numberB) {
double result = 0;
if (numberB == 0){
throw new RuntimeException("除数不能为0。");
}
result = numberA / numberB;
return result;
}
}
运算工厂类
public class OperationFactory
{
public Operation createOperate(String operate)
{
Operation oper = null;
switch (operate)
{
case "+":
{
oper = new OperationAdd();
break;
}
case "-":
{
oper = new OperationSub();
break;
}
case "*":
{
oper = new OperationMul();
break;
}
case "/":
{
oper = new OperationDiv();
break;
}
}
return oper;
}
}
测试类
public class test {
public static void main(String[] args) {
while(true) {
OperationFactory of=new OperationFactory();
Operation oper=of.createOperate("+");
System.out.println(oper.getResult(1, 2));//计算1+2
}
}
}
源码下载
码云:http://git.oschina.net/WuJiaJing/XiaoJingZiDeSheJiMoShiBiJiYuanMa/tree/master/