设计模式 | 简单工厂模式(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)模式,它属于类创建型模式. 在简单工厂模式 ...
随机推荐
- 洛谷 P1691 解题报告
P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...
- js相关
记录工作中用到的js实用方法: 1. 判断包含:indexOf "https".indexOf("http") 包含结果为0,不包含结果为-1: 通常用(&qu ...
- window安装mysql5.7解压版(解决乱码问题)
♣安装mysql两种方法 ♣下载mysql5.7解压版 ♣配置步骤 ♣解决服务无法启动 ♣解决乱码 1.安装mysql两种方法 MySQL安装文件分为两种,一种是msi格式的,一种是zip格式的.如果 ...
- @SpringBootApplication注解理解
@SpringBootApplication包含三个有用的注解,包括 @SpringBootConfiguration:看源码其实就是@Configuration,表示当前类是一个配置类,就像xml配 ...
- 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
报错: 解决:在语句开头指定SET NOCOUNT ON 就是这么神cao奇dan. -END-
- CentOS下使用命令行Web浏览器Links
前言: Links是一个运行在命令行模式下的Web浏览器,只能查看字符.Links的官网是Click here. 安装Links yum install links 使用Links links URL ...
- LeetCode Javascript实现 344. Reverse String 292. Nim Game 371. Sum of Two Integers
344. Reverse String /** * @param {string} s * @return {string} */ var reverseString = function(s) { ...
- Latex数学公式中的空格表示方法
两个quad空格 a \qquad b 两个m的宽度 quad空格 a \quad b 一个m的宽度 大空格 a\ b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 a\,b 1/6m宽度 ...
- Ubuntu基础教程——安装谷歌Chrome浏览器
对于刚刚开始使用Ubuntu并想安装谷歌Chrome浏览器的新用户来说,本文所介绍的方法是最快捷的.在Ubuntu上安装谷歌Chrome的方法有很多.一些用户喜欢直接在 谷歌Chrome下载页面 获得 ...
- 转载:selenium webdriver定位不到元素的五种原因及解决办法
1.动态id定位不到元素for example: //WebElement xiexin_element = driver.findElement(By.id("_mail_c ...