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 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- String类和StringBuffer类
位于java.lang包中,这个包中的类使用时不用导入 String类一旦初始化就不可以改变,而stringbuffer则可以.它用于封装内容可变的字符串.它可以使用tostring()转换成stri ...
- 修改原型给数组对象添加forEach
Array.prototype.forEach = function (callback, context) { for (var i = 0; i < this.length; i++) { ...
- 如何用MathType编辑这三个符号
MathType是一款专门的公式编辑器,用来编辑数学物理等公式,很多期刊杂志的排版都会用到它.用MathType编辑公式的时候,完全不用考虑学习和上手的过程,打开就可以编辑出你的公式,所以这个工具对于 ...
- retrival and clustering : week 4 GMM & EM 笔记
华盛顿大学 机器学习 笔记. k-means的局限性 k-means 是一种硬分类(hard assignment)方法,例如对于文档分类问题,k-means会精确地指定某一文档归类到某一个主题,但很 ...
- AutoMapper整理收集
http://www.cnblogs.com/jobs2/p/3503990.html http://www.cnblogs.com/1-2-3/p/AutoMapper-Best-Practice. ...
- 使用python封装get+post请求
思路: 将平时用的多的get和post请求封装,提高代码重用率. 其中Session类可以通过实例化,保存cookie信息,可以在程序结束前多次通过保存的cookie信息保持登录状态的访问. 那么为什 ...
- 分布式服务框架:Zookeeper简介
分布式服务框架:Zookeeper(分布式系统的可靠协调系统) 本文导读: 1 Zookeeper概述 2 Zookeeper总体结构 ——逻辑图.运转流程.特点.优点.数据结构 3 Zookeepe ...
- poj1699(状态压缩dp)
可能没有完全读懂题意. 个人觉得 acca aa 答案应该是4. 然后就是dp了..这题数据量小很多方法都可以,数据也水暴力据说都能过.. 还有就是我竟然没有用扩展kmp优化下... 太无耻了,我是因 ...
- 我的JavaScript笔记--面向对象
单例模式 ??(基于对象,不能批量生产) var person = { name: "ywb", sayHi: funct ...
- 8782:乘积最大(划分dp)
8782:乘积最大 同洛谷 P1018 乘积最大 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我 ...