设计模式 | 简单工厂模式(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)模式,它属于类创建型模式. 在简单工厂模式 ...
随机推荐
- SQL之left join,inner join,right join
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...
- Eclipse中使用github
摘要: 实现:git->eclipse的,eclipse->git双向 1.安装egit插件 在Eclipse中选择help->Eclipse Marketplace,在search ...
- java并发之CyclicBarrier
一.CyclicBarrier简述 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互 ...
- SVG的动态之美-搜狗地铁图重构散记
搜狗地图发布了新版的移动端地铁图,改版初衷是为了用户交互体验的提升以及性能的改善.原版地铁图被用户吐槽最多的是pinch缩放不流畅.无过渡动画.拖拽边界不合理等等,大体上都是交互体验上的问题.实际上原 ...
- C#通熟易懂观察者模式
观察者模式(有时又被称为模型-视图(View)模式.源-收听者(Listener)模式或从属者模式)是软件设计模式的一种.将观察者(watcher)和被观察者(subject)完美分离. 这里讲一个场 ...
- JavaScript-点击任意点显示隐藏
//开/关 var only = document.getElementById('only'); var centerBox = document.getElementById('centerBox ...
- union 的两个用处
1 节约内存: 这一功能可以参考我的其它博文: https://i.cnblogs.com/EditPosts.aspx?postid=8545190&update=1 2 测试机器大小端: ...
- dva/docs/GettingStarted.md
进入目录安装依赖: npm i 或者 yarn install开发: npm run dev npm install 太慢,试试yarn吧.建议用npm install yarn -g进行安装. Co ...
- localStorage和sessionStorage区别(包括同源的定义)
localStorage和sessionStorage一样都是用来存储客户端临时信息的对象. 他们均只能存储字符串类型的对象(虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现) ...
- 笔记一下NODEJS建站
1:npm的使用 -g的包安装用于命令行 --save用于建立依赖 建立依赖后的包只要使用npm install就可以直接全部安装 2:EJS和JADE模板 3:使用Mongoose对Mongodb进 ...