设计模式——简单工厂模式(SimpleFactory Pattern)
最近做项目总是遇到这样或者那样的问题,代码不够简洁,代码可扩展性不够好,耦合度又太高了,导致经常有种想去重构又无从下手的感觉。
无意间翻出了之前买的一本书《大话设计模式》读了一遍,受益匪浅,决定将其中的代码用java来实现一遍,个中精髓自行体会,
此处只做代码的具体实现。^-^
UML图:

模型:
产品基类:Product
package com.cnblog.clarck; /**
* 产品类
*
* @author clarck
*
*/
public class Product {
/**
* 创建产品
*
* @return
*/
public String createRealProduct() {
String product = "";
return product;
}
}
产品A的实例:ProductA
package com.cnblog.clarck; /**
* 产品A
*
* @author clarck
*
*/
public class ProductA extends Product { @Override
public String createRealProduct() {
String productA = "产品A";
return productA;
} }
产品B的实例:ProductB
package com.cnblog.clarck; /**
* 产品B
*
* @author clarck
*
*/
public class ProductB extends Product { @Override
public String createRealProduct() {
String productB = "产品B";
return productB;
} }
简单工厂类:ProductFactory
package com.cnblog.clarck; /**
* 产品工厂
*
* @author clarck
*
*/
public class ProductFactory {
public static Product createProduct(ProductType type) {
Product product = null;
switch (type) {
case PRODUCTA:
product = new ProductA();
break; case PRODUCTB:
product = new ProductB();
break; default:
break;
}
return product;
}
}
产品类型:ProductType
package com.cnblog.clarck; /**
* 产品A,产品B的类型
*
* @author clarck
*
*/
public enum ProductType {
PRODUCTA, PRODUCTB
}
测试类:Test
package com.cnblog.clarck; /**
* 测试用例
*
* @author clarck
*
*/
public class Test {
public static void main(String[] args) {
Product product = ProductFactory.createProduct(ProductType.PRODUCTA);
String productA = product.createRealProduct();
System.out.println(productA); product = ProductFactory.createProduct(ProductType.PRODUCTA);
String productB = product.createRealProduct();
System.out.println(productB);
}
}
实例运用:
---------------------------------------------------------------------------------------
数据运算基类:Operation
package com.cnblog.clarck; /**
* 数据运算基类
*
* @author clarck
*
*/
public class Operation {
private double mNmberA = 0;
private double mNumberB = 0; public double getNumberA() {
return mNmberA;
} public void setNmberA(double numberA) {
this.mNmberA = numberA;
} public double getNumberB() {
return mNumberB;
} public void setNumberB(double numberB) {
this.mNumberB = numberB;
} /**
* 获取运算结果
* @return
*/
public double getResult() {
double result = 0;
return result;
} }
加法类:OperationAdd
package com.cnblog.clarck; /**
* 加法类
*
* @author clarck
*
*/
public class OperationAdd extends Operation { @Override
public double getResult() {
double result = 0;
result = getNumberA() + getNumberB();
return result;
} }
减法运算类:OperationSub
package com.cnblog.clarck; /**
* 减法类
*
* @author clarck
*
*/
public class OperationSub extends Operation { @Override
public double getResult() {
double result = getNumberA() - getNumberB();
return result;
} }
乘法运算类:OperationMul
package com.cnblog.clarck; /**
* 乘法
*
* @author clarck
*
*/
public class OperationMul extends Operation { @Override
public double getResult() {
double result = getNumberA() * getNumberB();
return result;
} }
除法类:OperationDiv
package com.cnblog.clarck; /**
* 除法类
*
* @author clarck
*
*/
public class OperationDiv extends Operation { @Override
public double getResult() {
if (getNumberB() == 0) {
throwException();
} double result = getNumberA() / getNumberB();
return result;
} private void throwException() {
try {
throw new Exception("除数不能为0.");
} catch (Exception e) {
e.printStackTrace();
}
}
}
简单工厂类:OperationFactory
package com.cnblog.clarck; /**
* 工厂类
*
* @author clarck
*
*/
public class OperationFactory {
/**
* 创建运算类的工厂
*
* @param operate
* 运算类对象
* @return
* 创建成功-运算类对象,返回空
*/
public static Operation createOperation(OperationSymbol operate) {
Operation oper = null;
switch (operate) {
case ADDITION:
oper = new OperationAdd();
break; case SUBTRACTION:
oper = new OperationSub();
break; case MULTIPLICATION:
oper = new OperationMul();
break; case DIVISION:
oper = new OperationDiv();
break; default:
break;
}
return oper;
}
}
运算符号类:OperationSymbol
package com.cnblog.clarck; /**
* 加法, 减法, 乘法, 除法
*
* @author clarck
*
*/
public enum OperationSymbol {
ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION
}
测试类:Test
package com.cnblog.clarck; /**
* 测试类
*
* @author clarck
*
*/
public class Test {
public static void main(String[] args) {
Operation oper = null;
oper = OperationFactory.createOperation(OperationSymbol.ADDITION);
oper.setNmberA(1.0);
oper.setNumberB(2.0);
double addResult = oper.getResult();
System.out.println("addResult =" + addResult); oper = OperationFactory.createOperation(OperationSymbol.SUBTRACTION);
oper.setNmberA(1.0);
oper.setNumberB(2.0);
double subResult = oper.getResult();
System.out.println("subResult =" + subResult); oper = OperationFactory.createOperation(OperationSymbol.MULTIPLICATION);
oper.setNmberA(1.0);
oper.setNumberB(2.0);
double mulResult = oper.getResult();
System.out.println("mulResult =" + mulResult); oper = OperationFactory.createOperation(OperationSymbol.DIVISION);
oper.setNmberA(1.0);
oper.setNumberB(2.0);
double divResult = oper.getResult();
System.out.println("divResult =" + divResult);
}
}
设计模式——简单工厂模式(SimpleFactory Pattern)的更多相关文章
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- 简单工厂模式 SimpleFactory
简单工厂模式 SimpleFactory 1.1什么是简单工厂设计模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模 ...
- 3. 星际争霸之php设计模式--简单工厂模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- python 设计模式之工厂模式 Factory Pattern (简单工厂模式,工厂方法模式,抽象工厂模式)
十一回了趟老家,十一前工作一大堆忙成了狗,十一回来后又积累了一大堆又 忙成了狗,今天刚好抽了一点空开始写工厂方法模式 我看了<Head First 设计模式>P109--P133 这25页 ...
- IOS设计模式浅析之简单工厂模式(SimpleFactory)
概述 首先说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工厂方法模式,是工厂方法模式的特殊实现.这里对简单工厂模式进行介绍,是为本系列后面的工厂方法和抽象工厂模式做一个引子. 定义 ...
- Java设计模式 -- 简单工厂模式(SimpleFactory)
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...
- 设计模式-简单工厂模式(SimpleFactory)
简单工厂模式又叫静态工厂模式,,通过定义一个类(FruitFactory)来负责创建其他类的实例,被创建的实例通常都具有相同的父类(Fruit). 角色和职责: 1.工厂角色(Factory)-Fru ...
- C++设计模式——简单工厂模式
简单工厂模式(Simple Factory Pattern) 介绍:简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用 ...
- 深入浅出设计模式——简单工厂模式(Simple Factory)
介绍简单工厂模式不能说是一个设计模式,说它是一种编程习惯可能更恰当些.因为它至少不是Gof23种设计模式之一.但它在实际的编程中经常被用到,而且思想也非常简单,可以说是工厂方法模式的一个引导,所以我想 ...
随机推荐
- 【Python】测试布尔型盲注脚本
sqli-labs第八关:单引号布尔型盲注,手工测出database长度,个人觉得手工比较快 然后使用脚本测database内容,这个脚本就比手工快多了,脚本内容如下: import sys impo ...
- 公钥,私钥,数字签名,SSL的基本概念
一,公钥私钥 1,公钥和私钥成对出现 2,公开的密钥叫公钥,只有自己知道的叫私钥 3,用公钥加密的数据只有对应的私钥可以 解密 4,用私钥加密的数据只有对应的公钥可以解密 5,如果可以用公钥解密,则必 ...
- 启动Kafka
启动zookeeper 使用命令查看zookeeper是否启动成功: 启动kafka Brokerr 使用命令查看kafka Broker是否启动更成功 在kafka中创建topic 'test' b ...
- enum学习
https://www.cnblogs.com/hyl8218/p/5088287.html
- Tortoise SVN安装后右键没有菜单的解决方法
最近换了WIN7的操作系统,感觉用起来爽极了,于是开始一个个装软件,最让我头疼的就是安装SVN,安装没有问题,完成后却无法显示右键菜单,开始同事也帮我找原因,以为是我设置问题或者哪里阻止了程序,还以为 ...
- (转)创建DB2实例时出错,请大家帮忙解决
创建DB2实例时出错,请大家帮忙解决 原文:http://bbs.chinaunix.net/thread-3601748-1-1.html 运行:$DB2DIR/instance/db2icrt ...
- GridView, ListView 区别
ListView, GridView部分的类层次结构 AbsListView的xml属性 android:listSelector 当前item高亮时,显示的drawable android:draw ...
- [转]什么?你还不会写JQuery 插件
本文转自:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jque ...
- Cookie的遍历
全Cookie遍历 思路: 1.遍历主键 2.遍历每个主键下的子健 遍历语句: Foreach (string _key in request.cookie.Allkeys) { //对主键遍历... ...
- Spring课程 Spring入门篇 4-9 Spring bean装配之对jsr支持的说明
1 解析 1.1 疑问:2.2去掉@resource注解,为什么不能赋值?不是有set方法了吗? 1.2 @resource注解版本支持 1.3 没有显式指定@resource的那么,默认名称从何获得 ...