略解简单工厂模式

  之前在一家公司笔试的时候有过这样一道题:请用一种面向对象语言实现计算器控制台程序,输入两个数字和运算符号,输出结果。

  一开始脑子里想到的是这样滴:

 1 package com.edu.shnu.patternstudy;
 2
 3 import java.util.Scanner;
 4
 5 public class Caluate {
 6     public static void main(String[] args) {
 7         try{
 8             System.out.print("请输入数字m:");
 9             Scanner sc=new Scanner(System.in);
10             int m=sc.nextInt();
11             System.out.print("请输入运算符号(+、-、*、/):");
12             String oper=sc.next();
13             System.out.print("请输入数字n:");
14             int n=sc.nextInt();
15             int result=0;
16             switch(oper)
17             {
18             case "+":
19                 result=m+n;
20                 break;
21             case "-":
22                 result=m-n;
23                 break;
24             case "*":
25                 result=m*n;
26                 break;
27             case "/":
28                 if(n!=0)
29                     result=m/n;
30                 else
31                     System.out.println("除数不能为零!");
32                 break;
33             }
34             System.out.println("结果是:"+result);
35         }catch(Exception e){
36             e.printStackTrace();
37         }
38     }
39 }

  后来想到大话设计模式那本书了(强烈推荐),既然是面向对象语言,那就要封装、继承、多态了:

 1 class OperationAdd extends Operation
 2 {
 3     Operation oper=new Operation();
 4     @Override
 5     public int getResult(){
 6         int result=oper.getM()+oper.getN();
 7         return result;
 8     }
 9 }
10
11 class OperationSub extends Operation
12 {
13     Operation oper=new Operation();
14     @Override
15     public int getResult(){
16         int result=oper.getM()-oper.getN();
17         return result;
18     }
19 }
20
21 class OperationMul extends Operation
22 {
23     Operation oper=new Operation();
24     @Override
25     public int getResult(){
26         int result=oper.getM()*oper.getN();
27         return result;
28     }
29 }
30
31 class OperationDiv extends Operation
32 {
33     Operation oper=new Operation();
34     @Override
35     public int getResult(){
36         if(oper.getN()==0)
37             System.out.println("除数不能为零!");
38         int result=oper.getM()/oper.getN();
39         return result;
40     }
41 }

  到底要实例化谁,将来会不会增加新的实例化的对象,这个容易变化,应该考虑用一个单独的类来做创造实例的过程,即工厂。

 1 public class OperationFactory {
 2     public static Operation createOperation(String operate){
 3         Operation oper=null;
 4         switch(operate){
 5         case "+":
 6             oper=new OperationAdd();
 7             break;
 8         case "-":
 9             oper=new OperationSub();
10             break;
11         case "*":
12             oper=new OperationMul();
13             break;
14         case "/":
15             oper=new OperationDiv();
16             break;
17         }
18         return oper;
19     }
20 }

main方法中:

1   Operation oper;
2    oper=OperationFactory.createOperation("+");
3    oper.setM(4);
4    oper.setN(2);
时间: 2024-10-06 00:07:12

略解简单工厂模式的相关文章

Java设计模式(一) 简单工厂模式不简单

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/design_pattern/simple_factory 简单工厂模式使用案例 有一种抽象产品--汽车(Car),同时有多种具体的子类产品,如BenzCar,BMWCar,LandRoverCar.类图如下 作为司机,如果要开其中一种车,比如BenzCar,最直接的做法是直接创建BenzCar的实例,并执行其drive方法,如下 package com.

Java研究之学习设计模式-简单工厂模式详解

 简介: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例. 类图: 从UML类图中,可以看出,简单工厂模式的意思,就是把一个类内部,需要生成的部分,提取出来,变为一个工厂,通过工厂来new对象. 假设我们要吃苹果了,我们可以在代码中new一个苹果出来:当我们需要吃香蕉了,我们在代码中new一个香蕉出来.这种做法你会不会觉得麻烦

胡博君解Java中简单工厂模式

为什么要用简单工厂模式: 我们都知道程序是分开的,客户端中有程序,服务器端有程序,一般来说我们写的main方法中的程序都是在客户端电脑中的,按照我们学习的时候喜欢的写法: //一般来说这个程序都是在客户电脑中,俗称调用者 public  class  Text{ public static void main(String[] args) { Person  p  =  new  Person(); p.getInfo(); } } //一般这个程序都在服务器中,俗称被调用者,而且是可以修改的

设计模式之 简单工厂模式详解

定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现.             定义中最重要的一句话就是,由一个工厂对象决定创建出哪一种产品类的实例,这个LZ在下面会专门举一个现实应用中的例子去展现. 另外给出简单工厂模式的类图,本类图以及上面的

第一章 简单工厂模式

面向对象编程永远在考虑:解藕和复用. 设计模式是前辈总结的结果,这些模式都是基于问题本身的抽象,活学活用才是王道. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 简单工厂模式具有面向对象编程的基本优点:封装.继承和多态. /** * Created by hero

[python实现设计模式]-3.简单工厂模式

预备知识: 开放封闭原则(Open-Closed Principle OCP) Software entities(classes,modules,functions etc) should open for extension ,but close for modification. 所谓开放封闭原则就是软件实体应该对扩展开放,而对修改封闭.开放封闭原则是所有面向对象原则的核心. 软件设计本身所追求的目标就是封装变化,降低耦合,而开放封闭原则正是对这一目标的最直接体现. 对扩展开放,意味着有新

<一>读<<大话设计模式>>之简单工厂模式

工厂模式虽然简单,但是写下这篇文章却不简单.第一:本人经过内心的挣扎后才决定开始写博文的,为什么呢,因为好长时间没有写了,对自己的文学功底也是好不自信,但是技术这东西你不写出来你真不知道自己掌握多少,或者是否掌握其本质:第二:老婆怀孕了,没时间写了,但是我还是挤出时间开始写,于是这篇文章在这样的环境下成了,以后还有后续的文章,谢谢关注! 为什么从设计模式开始学习呢?其实以前对设计模式有些了解,但是用不到也就没有深入,现在差不多也忘完了,本人工作三年了,对一些大众上的技术(比如struts2.sp

简单工厂模式(静态工厂)和工厂方法模式和抽象工厂模式

首先是简单工厂模式. 一句话描述就是用一个工厂类去封装new的工厂,返回新建的一个对象的引用.如果这个方法是静态的,就称之为静态工厂.一般来说这种做法很常见,尤其在一些JAVA工具类中.它的好处和坏处网上的分析都很多,但我觉得没必要分的这么细.最最最直接的好处是用起来简单,方便和不容易出错. 工厂方法模式则复杂一点.它的做法是在父类声明一个final方法用来真正被外部调用(在子类中被继承但是不允许覆盖).在这个方法中调用一个抽象方法去具体实现新建对象,可是这个抽象方法本身由子类实现. 举个例子就

设计模式之_简单工厂模式、工厂方法模式、抽象工厂模式 、策略模式、策略与工厂的区别(转)

一.前言 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“开宝马车!”,坐上 Audi后他说“开奥迪车!”.你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的 幸运的是这种有病的现象在OO语言中可以避免了.下面以Java语言为基础来引入我们本文的主题:工厂模式! 二.简介