java 工厂模式的作用,为什么要用工厂模式以及示例演示
1 工厂模式的作用,为什么要用工厂模式?
工厂模式是为了解耦:把对象的创建和使用的过程分开。就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类。
工厂模式可以降低代码重复。如果创建B过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。可以把这些创建对象B的代码放到工厂里统一管理。既减少了重复代码,也方便以后对B的维护。
工厂模式可以减少错误,因为工厂管理了对象的创建逻辑,使用者不需要知道具体的创建过程,只管使用即可,减少了使用者因为创建逻辑导致的错误。
2.工厂模式的一些适用场景:
对象的创建过程/实例化准备工作很复杂,需要很多初始化参数,查询数据库等
类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变
3.示例演示
下面实现一个加减乘除的工厂方法模式
package demo8;
/**
* 工厂接口
*
*/
interface IFactory {
Operation CreateOperation();
}
package demo8;
/**
* 具体工厂(Concrete Creator)角色:加法类工厂
*
*/
public class AddFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationAdd();
}
}
package demo8;
/**
* 具体工厂(Concrete Creator)角色:减法类工厂
*
*/
public class SubFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationSub();
}
}
package demo8;
/**
* 具体工厂(Concrete Creator)角色:乘法类工厂
*
*/
public class MulFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationMul();
}
}
package demo8;
/**
* 具体工厂(Concrete Creator)角色:除法类工厂
*
*/
public class DivFactory implements IFactory {
@Override
public Operation CreateOperation() {
return new OperationDiv();
}
}
package demo8;
/**
* 抽象产品(Product)角色:运算类
*
*/
public abstract class Operation {
private double numberA = 0;
private double numberB = 0;
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public void setNumberB(double numberB) {
this.numberB = numberB;
}
public double getNumberA() {
return numberA;
}
public double getNumberB() {
return numberB;
}
public double getResult() {
double result = 0;
return result;
}
}
package demo8;
/**
* 具体产品(Concrete Product)角色:加法类
*
*/
public class OperationAdd extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() + super.getNumberB();
return result;
}
}
package demo8;
/**
* 具体产品(Concrete Product)角色:减法类
*
*/
public class OperationSub extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() - super.getNumberB();
return result;
}
}
package demo8;
/**
* 具体产品(Concrete Product)角色:乘法类
*
*/
public class OperationMul extends Operation {
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() * super.getNumberB();
return result;
}
}
package demo8;
/**
* 具体产品(Concrete Product)角色:除法类
*
*/
public class OperationDiv extends Operation {
@Override
public double getResult() {
double result = 0;
if (super.getNumberB() == 0)
throw new ArithmeticException("除数不能为0.");
result = super.getNumberA() / super.getNumberB();
return result;
}
}
package demo8;
/**
* 客户端
*
*/
public class Demo8 {
public static void main(String[] args) {
IFactory operFactory = new AddFactory();
Operation oper = operFactory.CreateOperation();
oper.setNumberA(10);
oper.setNumberB(7);
double result = oper.getResult();
System.out.println(result);
}
}
java 工厂模式的作用,为什么要用工厂模式以及示例演示的更多相关文章
- JAVA设计模式(01):创建型-工厂模式【工厂方法模式】(Factory Method)
简单工厂模式尽管简单,但存在一个非常严重的问题.当系统中须要引入新产品时,因为静态工厂方法通过所传入參数的不同来创建不同的产品,这必然要改动工厂类的源码,将违背"开闭原则".怎样实 ...
- Java开发中的23中设计模式详解(一)工厂方法模式和抽象工厂模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- JAVA设计模式 3【创建型】理解工厂模式与抽象工厂模式
上一节我们已经学习了原型模式,稍微复习一下:通过重写Object 类的clone() 方法实现浅克隆,浅克隆也要实现Cloneable 标记接口.而深克隆则是将对象通过序列化和反序列化 的方式进行创建 ...
- Java基础学习总结(37)——Java23中设计模式(Design Patterns)详解
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java-23种设计模式概述【软件设计模式基本介绍(是什么、作用、优点)、模式的分类和介绍】
一.设计模式基本介绍(是什么.作用.优点) 1.软件设计模式是什么? 软件设计模式(Software Design Pattern),又称设计模式. 2.设计模式的作用 ★ 提高代码的可复用性.可维护 ...
- 创建型模式(前引)简单工厂模式Simple Factory
一引出的原因(解决下面的问题) 简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式. 在简单工厂模式 ...
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- JAVA中protected的作用
JAVA中protected的作用 1.public:public表明该数据成员.成员函数是对所有用户开放的,所有用户都可以直接进行调用 2.private:private表示私有,私有的意思就是 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- Batch Normailzation
转自:http://blog.csdn.net/malefactor/article/details/51476961
- linux 知识点拾遗
文件名称 在 Linux 底下,每个档案或文件夹的文件名称最长能够到达 255 的字符,加上完整路径时,最长可达 4096 个字符; 因为 Linux 在文字接口下的一些指令操作关系,一般来说,您在设 ...
- 你很熟悉CSS,却没掌握这些CSS技巧
转载来自 http://www.html5cn.org/article-9294-1.html 做前端开发的人都很熟悉CSS,一个漂亮的网页由HTML标签和控制这些标签布局的CSS组成,因此CSS在开 ...
- MAC必装神器
1. SizeUp 置中窗口的设置: Relative to Screen Size 宽80% 高80% 快捷键的设置 ctr+option+cmd+, 全窗口 ctr+option+cmd+. 置中 ...
- uva 465 - Overflow 高精度还是浮点数?
uva 465 - Overflow Overflow Write a program that reads an expression consisting of two non-negativ ...
- 解决百度地图Fragment切换黑屏问题
https://blog.csdn.net/rentalphang/article/details/52076330 轻松解决啦!
- 面试题思考:interface和abstract的区别
抽象类(abstract) 含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象. 含有abstract方法的类必须定义为abstract class,abstra ...
- IOS无限自动循环滚动banner(源码)
本文转载至 http://blog.csdn.net/iunion/article/details/19080259 目前有很多APP都开始使用一些滚动banner,我自己也做了一个,部分算法没有深 ...
- 爬虫实战【13】获取自己的动态代理ip池
在爬取一些比较友好的网站时,仍然有可能因为单位时间内访问次数过多,使服务器认定为机器访问,导致访问失败或者被封.如果我们使用不同的ip来访问网站的话,就可以绕过服务器的重复验证,使服务器以为使不同的人 ...
- Win10-64位 免安装版Mysql8下载安装运行
今天忙活了很久去下载安装Mysql,感觉网上的那些教程怎么都对不上呢,很奇怪,不过我乱点一通至少能用了,先凑和着用吧... 记录一下, 要是不对的,以后再修改...windows10系统 2018-5 ...