设计模式 | 简单工厂模式(static factory method)
package designpattern.staticfactorymethod;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
double num1 = scanner.nextDouble();
System.out.println("请输入一个运算符:+、-、*、/");
String operator = scanner.next();// 不能用nextLine(),会把上一个回车给吸收
System.out.println("请输入一个数字");
double num2 = scanner.nextDouble();
switch (operator) {
case "+":
System.out.println(num1 + num2);
break;
case "-":
System.out.println(num1 - num2);
break;
case "*":
System.out.println(num1 * num2);
break;
case "/":
System.out.println(num1 / num2);
break;
default:
break;
}
scanner.close();
}
}
最多把计算的方法单拉出来:
package designpattern.staticfactorymethod;
import java.util.Scanner;
public class Calculator2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
double num1 = scanner.nextDouble();
System.out.println("请输入一个运算符:+、-、*、/");
String operator = scanner.next();// 不能用nextLine(),会把上一个回车给吸收
System.out.println("请输入一个数字");
double num2 = scanner.nextDouble();
switch (operator) {
case "+":
System.out.println(plus(num1, num2));
break;
case "-":
System.out.println(minus(num1, num2));
break;
case "*":
System.out.println(multiply(num1, num2));
break;
case "/":
System.out.println(divide(num1, num2));
break;
default:
break;
}
scanner.close();
}
static double plus(double num1, double num2) {
return num1 + num2;
}
static double minus(double num1, double num2) {
return num1 - num2;
}
static double multiply(double num1, double num2) {
return num1 * num2;
}
static double divide(double num1, double num2) {
return num1 / num2;
}
}
package designpattern.staticfactorymethod;
public class CalculatorUtil {
static double plus(double num1, double num2) {
return num1 + num2;
}
static double minus(double num1, double num2) {
return num1 - num2;
}
static double multiply(double num1, double num2) {
return num1 * num2;
}
static double divide(double num1, double num2) {
return num1 / num2;
}
}

package designpattern.staticfactorymethod;
import java.util.Scanner;
public class Calculator3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
double num1 = scanner.nextDouble();
System.out.println("请输入一个运算符:+、-、*、/");
String operator = scanner.next();// 不能用nextLine(),会把上一个回车给吸收
System.out.println("请输入一个数字");
double num2 = scanner.nextDouble();
Calculator3 calculator3 = new Calculator3();
switch (operator) {
case "+":
System.out.println(calculator3.new Plus(num1, num2).calculate());
break;
case "-":
System.out.println(calculator3.new Minus(num1, num2).calculate());
break;
case "*":
System.out.println(calculator3.new Multiply(num1, num2).calculate());
break;
case "/":
System.out.println(calculator3.new Divide(num1, num2).calculate());
break;
default:
break;
}
scanner.close();
}
class Plus {
double num1;
double num2;
Plus(double num1, double num2) {
this.num1 = num1;
this.num2 = num2;
}
double calculate() {
return num1 + num2;
}
}
class Minus {
double num1;
double num2;
Minus(double num1, double num2) {
this.num1 = num1;
this.num2 = num2;
}
double calculate() {
return num1 - num2;
}
}
class Multiply {
double num1;
double num2;
Multiply(double num1, double num2) {
this.num1 = num1;
this.num2 = num2;
}
double calculate() {
return num1 * num2;
}
}
class Divide {
double num1;
double num2;
Divide(double num1, double num2) {
this.num1 = num1;
this.num2 = num2;
}
double calculate() {
return num1 / num2;
}
}
}
package designpattern.staticfactorymethod;
public abstract class Calculate {
double num1;
double num2;
Calculate() {
}
Calculate(double num1, double num2) {
this.num1 = num1;
this.num2 = num2;
}
public abstract double calculate();
}
具体运算子类们:
package designpattern.staticfactorymethod;
public class Plus extends Calculate {
Plus() {
}
Plus(double num1, double num2) {
super(num1, num2);
}
@Override
public double calculate() {
return num1 + num2;
}
}
package designpattern.staticfactorymethod;
public class Minus extends Calculate {
Minus() {
}
Minus(double num1, double num2) {
super(num1, num2);
}
@Override
public double calculate() {
return num1 - num2;
}
}
package designpattern.staticfactorymethod;
public class Multiply extends Calculate {
Multiply() {
}
Multiply(double num1, double num2) {
super(num1, num2);
}
@Override
public double calculate() {
return num1 * num2;
}
}
package designpattern.staticfactorymethod;
public class Divide extends Calculate {
Divide() {
}
Divide(double num1, double num2) {
super(num1, num2);
}
@Override
public double calculate() {
return num1 / num2;
}
}

当然实际代码中,不能像上面这样天马行空,术业还是要有专攻的,比如一个工厂专门生产各种各样的女朋友,额。。
比如iphon的工厂专门生产各种型号的ipone。
把这个思想用到我们的程序中,我们需要一个工厂,接受一个参数,然后它就能返回相应的对象:
package designpattern.staticfactorymethod;
public class CalculateFactory {
public static Calculate create(String operate) {
switch (operate) {
case "+":
return new Plus();
case "-":
return new Minus();
case "*":
return new Multiply();
case "/":
return new Divide();
}
return null;
}
}
package designpattern.staticfactorymethod;
import java.util.Scanner;
public class Calculator4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个数字");
double num1 = scanner.nextDouble();
System.out.println("请输入一个运算符:+、-、*、/");
String operator = scanner.next();// 不能用nextLine(),会把上一个回车给吸收
System.out.println("请输入一个数字");
double num2 = scanner.nextDouble();
Calculate calculate = CalculateFactory.create(operator);
calculate.num1 = num1;
calculate.num2 = num2;
System.out.println(calculate.calculate());
scanner.close();
}
}
这回多态也出场了,通过多态,统一用父类接受创建的具体子类,当需要增加运算方式时,只需要修改工厂类和具体的运算类,调用的地方不用变,降低了模块间的耦合性,提高了系统的灵活性。
设计模式 | 简单工厂模式(static factory method)的更多相关文章
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- 深入浅出设计模式——简单工厂模式(Simple Factory)
介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...
- 【设计模式】简单工厂模式 Simple Factory Pattern
简单工厂模式Simple Factory Pattern[Simple Factory Pattern]是设计模式里最简单的一个模式,又叫静态工厂模式[Static Factory Pattern], ...
- 设计模式之简单工厂模式(Simply Factory)摘录
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫静态工厂方法(Static Factory Method)模式.但不属于23种GOF设计模式之中的一个.简单工厂模式是由一个工厂对象决定创建出 ...
- 设计模式~简单工厂模式(Factory)
简单工厂模式Simple Factory根据提供给它的数据,返回一个类的实例.通常它返回的类都有一个公共的父类(或者接口对象). 简单工厂的作用是实例化对象,而不需要客户了解这个对象属于哪个具体的子类 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- 设计模式之工厂模式(Factory)(3)
在面向对象编程中,最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下,new操作符直接生成对象会带来一些问题.举例来说,许多类型对象的创造需要一系列的 ...
- 二级小兵——工厂模式(Factory Method)
前言 上一篇我们介绍了单例模式,今天给大家讲一个比较简单的模式——工厂模式(Factory Method),工厂模式又是什么呢?顾名思义,工厂——生产制造东西的地方.那么应用在程序当中该如何使用.并且 ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
随机推荐
- Fibonacci数列的解法
Fibonacci数列的解法: 1.递归算法 递归的概念,我说不清楚,语文不好.但是核心思想,我认为就是入栈出栈.比方说,你想要求得某个结果,如果一步求解不出来,那么先把最后一步的计算步骤进栈,先不考 ...
- struct和union的区别
1)union是几个不同类型的变量共占一段内存(相互覆盖):struct是把不同类型的数据组合成一个整体 2)对齐方式略有区别:union不需要+,只需要拿出对齐后的最长 structure unio ...
- Linux时间子系统之(一):时间的基本概念
专题文档汇总目录 Notes:Linux时间基准点:Linux时间和broken-down time(struct tm):不同精度的时间表示time_t.timeval.timespec. 原文地址 ...
- SpringCloud Eureka 报错 无法启动问题
1.SpringCloud Eureka 报错 无法启动基本上都是spring boot的版本与spring cloud的版本不匹配导致的. <dependencyManagement> ...
- Javascript 进阶 面向对象编程 继承的一个例子
Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...
- Java 学习笔记 (七) Java 参数
head first java page 74 实参: argument 形参: parameter 方法会运用形参, 调用的一方会传入实参. 实参是传给方法的值.当它传入方法后就成了形参, 参数跟局 ...
- VS编译代码未通过,常见问题。
问题一:LNK2028 这个问题一般是什么函数在哪里被引用.修改的方法是:先检查是否包含头文件,如果已经包含了头文件,则检查在源文件的"import.cpp"中是否包含了该lib文 ...
- Python初学者必看(1)
python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- react VS vue 我们究竟该如何选择(从项目的角度帮你分析)
一.序言 现在web开发最火的两个框架,react和vue.听起来就感觉很牛逼的样子.确实,不得不服,创造出这2种框架的人真的是牛逼.不过更牛逼的是为这2中框架不断完善的人.一个优秀的idea,会在很 ...
- hkws摄像头拆机