第一话-简单工厂模式

原创 2014年11月03日 18:52:46

写在前面:本人最近在看《大话设计模式》这本书,书里是用C#讲解的实例。现在写心得笔记与大家分享,就试着写一个JAVA版的。例子还是书里的例子。不过是Java语言实现的。后面也会给出本人的一些理解建议。谢谢《大话设计模式》的作者。

一、什么是简单工厂模式?

简单工厂模式是工厂模式里最简单的一种,所以叫做简单工厂模式。简单工厂模式需要一个工厂类去对类的实例进行条件分发,这样可以省去程序分发时的麻烦,并且把分发的代码从主类中移到一个单独的类里,这样既能使代码简洁明了,有使代码灵活性争强。具体请看下面的例子。

二、用于什么情况?

工厂类负责创建的对象比较少;
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。
三、懂了么?请看实例(计算器)。
做一个简单计算器,无非操作数1,操作符,操作数2。既然是用面向对象的语言,那咱们就以面向对象的思想进行设计。
为了使代码可重用,不用复制粘贴,那咱们就把处理和交互进行分离:这样就有了Operation类和Main类
但是这样还不够好,所有的操作(加减乘除)都放到一个类里,这样对代码的扩展性不好,所以咱们就把这些操作分离,那咱么就可以再把Operation类分离,分离成一个主类Operation和四个子类AddOperation,SubOperation,MulOperation,DivOperation去继承Operation类
已经晕了么?不要紧,看下去。
你可能感觉这样已经可以了,但不要忘了咱们的重点,咱们的重点是“简单工厂模式”,那咱们就用他了。他不是分发么,咱们的程序是计算,那显示里肯定有计算的对象啊,那咱们该用哪个类的对象去做运算呢?你可能想到了根据用户输入的“运算符”来选择,正确。可是这个选择要是放到显示交互的主类里,那是不是没有把逻辑处理和显示交互分离干净?所以用咱们的简单工厂模式,建立一个工厂类OperationFactory去负责分发创建这些类。这样主类就不用考虑这些了,是不是感觉很清晰了呢?好,上代码。

Main.java
/**
*主要负责与用户交互,让用户输入数据,处理后输出数据
**/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
 public static void main(String[] args) throws IOException {
  // TODO Auto-generated method stub
  String num1 = "0";
  String num2 = "0";
  String ope = "+";
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  System.out.print("请输入第一个操作数:");
  num1 = in.readLine();
  System.out.print("请输入操作符('+','-','*','/'):");
  ope = in.readLine();
  System.out.print("请输入第二个操作数:");
  num2 = in.readLine();
  Operation operation = OperationFactory.createOperation(ope);
  if (operation != null) {
   operation.setNumber1(Double.parseDouble(num1.trim()));
   operation.setNumber2(Double.parseDouble(num2.trim()));
   System.out.println("计算结果为:" + operation.calculate());
  }
 }
}

Operation.java
/**
*操作类,只有两个处理数;注意此类为抽象类。有一个重要的方法calculate()这个是计算的重点,因为操作是有其子类完成所以定义为抽象方法让子类去各自实现
**/
public abstract class Operation {
 protected double number1;
 protected double number2;
 public double getNumber1() {
  return number1;
 }
 public void setNumber1(double number1) {
  this.number1 = number1;
 }
 public double getNumber2() {
  return number2;
 }
 public void setNumber2(double number2) {
  this.number2 = number2;
 }
 public abstract double calculate();
}

AddOperation.java
public class AddOperation extends Operation {
 public double calculate() {
  // TODO Auto-generated method stub
  double result = number1 + number2;
  return result;
 }
}

SubOperation.java
public class SubOperation extends Operation {
 public double calculate() {
  // TODO Auto-generated method stub
  double result = number1 - number2;
  return result;
 }
}

MulOperation.java
public class MulOperation extends Operation {
 public double calculate() {
  // TODO Auto-generated method stub
  double result = number1 * number2;
  return result;
 }
}

DivOperation.java
public class DivOperation extends Operation {
 public double calculate() {
  // TODO Auto-generated method stub
  if (number2 != 0) {
   double result = number1 / number2;
   return result;
  }
  System.out.println("number cannot be the 0");
  return 0;
 }
}

OperationFactory.java
/**
*此为工厂类,进行对象的分发
**/
public class OperationFactory {
 public static Operation createOperation(String operator) {
  Operation operation = null;
  if ("+".equals(operator)) {
   operation = new AddOperation();
  } else if ("-".equals(operator)) {
   operation = new SubOperation();
  } else if ("*".equals(operator)) {
   operation = new MulOperation();
  } else if ("/".equals(operator)) {
   operation = new DivOperation();
  }
  return operation;
 }
}

四、小结和建议
简单工厂模式是非常简单的一个模式,所以使用的情况也非常的局限。其实你无形中已经使用过这个模式,只是你没发现而已。不信,你想想。
程序虽然已经完成,但还有很多要考虑的问题,比如:
本文中是用的double类型,如果用户非要求用int型怎么办?所以可以用泛型;
此程序的操作数只有两个,万一有好多操作数呢?可以用java的集合去处理;
这样就是最美的了么?答案是否定的。问题留给聪明的你,相信你肯定能想到。
谢谢你能看到这里。下一话:策略模式。

版权声明:本文为博主原创文章,未经博主允许不得转载。

第一话

申请很长时间了,一语未发。时间是个大问题,一直很忙。运气好的话,明年就有时间了。我定期看别人写的,我喜欢看。...
  • zhy0101
  • zhy0101
  • 2005年09月19日 08:18
  • 426

开篇第一话

一晃半年又过去了,回头看看,毕业6年了,还以为自己还年轻呢,人呐,真奇怪,想想未来很遥远,回忆过去却都历历在目,感叹一句吧,逝者如斯夫,不舍昼夜。 人都27、8快30的人了,却还是一副青葱样子,哎样子...
  • gavin_sunjiaw
  • gavin_sunjiaw
  • 2015年09月19日 20:51
  • 99

博客之第一话

有了博客了。以后学习的东西也
  • walt999
  • walt999
  • 2014年07月08日 14:20
  • 186

java工厂模式——简单工厂模式

当A对象需要调用B对象的方法是,许多初学者会选择使用new关键字来创建一个B实例,然后调用B实例的方法。从语法角度来看,这种做法没有任何问题,这种做法的坏处在于:A类的方法实现直接调用了B类的类名(这...
  • huang_xw
  • huang_xw
  • 2012年06月16日 16:31
  • 5898

C++ 设计模式之——简单工厂模式(SimpleFactoryPattern)

简单工厂模式   简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建...
  • nie2314550441
  • nie2314550441
  • 2016年02月18日 17:40
  • 414

设计模式第一话——单例模式

(一)  什么是设计模式? 是一套被世人反复使用的,多数人知晓的,经过分类的代码设计经验的总结。 将实战项目比作一场战争的话,设计模式就是孙子兵法的三十六计。 (二)  设计模式的目的是什么? ...
  • xiaoyuaifuxiao
  • xiaoyuaifuxiao
  • 2017年03月18日 22:13
  • 230

C# 简单工厂设计模式

简单工厂设计模式: C#- 简单工厂模式   一、   简单工厂( Simple Factory )模式   Simple Fa...
  • u013799020
  • u013799020
  • 2014年06月24日 00:39
  • 431

工厂方法模式VS简单工厂模式

One----简单工厂模式: 一,基本知识: (1)定义:简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。(2)理...
  • qq_28055429
  • qq_28055429
  • 2016年06月10日 23:14
  • 1543

javascript设计模式--简单工厂模式

简单工厂模式(simple Factory):又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。主要用来创建同一类对象。 举个例子,比如说体育商品店卖体育器材,里面有很多体育用品,及其...
  • sinat_29843547
  • sinat_29843547
  • 2016年04月12日 10:47
  • 590

简单工厂模式(C++描述)

一.简单工厂模式又称静态工厂方法模式(Static Factory Method),它不是Gof 所讲的23种设计模式之一,但是它却是我们在编码过程中经常使用的方法之一。 1.静态工厂方法统一管理对象...
  • chollima
  • chollima
  • 2009年03月12日 22:43
  • 17047
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第一话-简单工厂模式
举报原因:
原因补充:

(最多只允许输入30个字)