为什么要使用工厂模式

工厂的作用相当于帮助我们完成实例化的操作。

优势1:一般在代码中,实例化一个类A是直接new A(),假如类A是一个完全独立的类,没有相似类,则没有必要使用工厂模式,直接new A()没有毛病。但是如果类A本身有一个相似类B,而在实际使用类A或者类B的实例时,如果关心的是类A与类B的共同部分,则工厂模式就可以体现出它的优势。

比如调用数据库,所有的数据库都有插入操作insert:

interface DatabaseOperate{
    public void insert(Mydata data){
    }
}

然而,不同的数据库的具体实现方法是不同的
class MySQLOperate implements DatabaseOperate{
    @Override
    public void insert(Mydata data){
        ...
    }
}
class OracleOperate implements DatabaseOperate{
    @Override
    public void insert(Mydata data){
        ...
    }
}
然而真正使用插入操作的时候,我们需要关心的并不是插入操作如何具体实现,我们只需要对数据库进行插入操作就行了,所以使用工厂类对具体实现方法进行整合

class MyDBFactory{
    
    public static int MySQL=1;
    public static int Oracle=2;
    public static int DBType = MySQL;
    public static DatabaseOperate getDatabase(){
        if(DBType=MySQL){
            return new MySQLOperate();
        }
        
        if(DBType=Oracle){
            return new OracleOperate();
        }
    }
}
这样我们在调用的时候就可以忽略具体实现方法,而直接进行调用。
void insert(Mydata data){
    DatabaseOperate operate = MyDBFactory.getDatabase();
    operate.insert(data);
}
在这里,工厂模式相当于实现了下面的代码。
class MySQLOperate{
    public void insert(Mydata data){
        ...
    }
}
void inert(Mydata data){
    MySQLOperate opertate = new MySQLOperate();
    operate.insert(data);
}
如果这样编写,在进行数据库切换时,需要重新写insert()方法,尤其是在很多地方用到与insert()方法相同的操作时,要在很多地方new MySQLOperate这个类,修改起来跟家麻烦。
这个优势有两个应用场景:

一个是上述的例子,可以动态的使用代码,只需要修改部分配置。

还有一个是在一个大类需要很多小类的时候,每种小类负责完成一部分工作,但是有不同的完成方法,大类只需要设置条件,工厂自动返回合适的小类。

优势2:初始化封装。在需求一个类的实例时,假如需要一个相同属性的实例,每次初始化的操作是一样的,用工厂模式可以对初始化进行封装,简化操作。

比如有一个类Car

class Car{
    private String brand;
    private double price;
    public Car(String brand,double price){
        this.brand=brand;
            this.price=price;    
    }
}

我们在实例化一个Audi的时候,赋值brand为Audi,price为30000

void createCar(){
    Car car1 = new Car("Audi",300000);
    Car car2 = new Car("Audi",300000);
}
每次要用到Audi这个实例的时候,都要给定两个初始化参数,"Audi"和30000,然而如果确定了brand为Audi的话,price随之确定为300000,每次实例化的时候要输入多个( 这里是两个)参数,会显得很麻烦。
所以我们这里使用工厂模式


public CarFactory

{
    private Map<String,Car> cars = new HashMap<>();
 
    static

   {
        cars.put("Audi",new Car("Audi",300000));
    }
    
    public static Car getCar(String name)

   {
        return cars.get(name);
    }
 
}
然后我们在实例化Audi时,只需要输入他的名称就可以得到参数完整的Audi


void createCar(){
    Car car1 = CarFactory.getCar("Audi");
    Car car2 = CarFactory.getCar("Audi");
}
这样大大简化了实例化时的初始化设置。


--------------------- 
作者:zinsserzc 
来源:CSDN 
原文:https://blog.csdn.net/qq_28859325/article/details/60580578 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css各兼容应该注意的问题

1.div布局在ie浏览器和chrome浏览器&#xff0c;firefox浏览器不同&#xff0c;不如在div里面嵌套3个div&#xff0c;分别左中右&#xff0c;左边div的pading和margin在ie8以上都是几乎相同&#xff0c;ie8以下做内边距x2&#xff0c;在中间的div在chrome和fierfox中默认在左边…

转 C++宏定义详解

来自&#xff1a;传送门 C宏定义详解 一、#define的基本用法 #define是C语言中提供的宏定义命令&#xff0c;其主要目的是为程序员在编程时提供一定的方便&#xff0c;并能在一定程度上提高程序的运行效率&#xff0c;但学生在学习时往往不能 理解该命令的本质&#xff0c;总是…

acm之vim的基本配置

http://www.kuangbin.net/archives/vim-acmicpc 转载于:https://www.cnblogs.com/akrusher/articles/5402426.html

40 个重要的 HTML5 面试问题及答案

2019独角兽企业重金招聘Python工程师标准>>> 介绍 我是一个ASP.NET MVC开发人员。最近当我找工作的时候&#xff0c;我发现很多问题都是围绕HTML 5和它的新功能展开的。所以&#xff0c;下面我将列出40个有助于你提高相关HTML 5知识的重要问题。 这些问题并不能保证…

Java常见Jar包的用途

jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现、查找和实现可插入式接口&#xff0c;提供一些一般类实例化、单件的生命周期管理的常用方法. jaxrpc.jar Axis运行所需要的组件包 saaj.jar 创建到端点的点到点连接的方法、创建并处理SOAP消息和附件的方法…

车流检测之halcon光流法算法实现

* This example program shows how to use optical_flow_mg to compute the optical flow in an image sequence and how to segment the optical flow. *这个示例程序显示了如何使用._flow_mg来计算图像序列中的光流&#xff0c;以及如何分割光流。 dev_update_off () dev_…

利用光学流跟踪关键点---30

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 关键点&#xff1a;是多个方向上亮度变化强的区域。 opencv:版本是2.4. 光学流函数&#xff1a;calcOpticalFlowPyrLK()。&#xff08;关键点侦测器使用goodFeaturesToTrack()&#xff09;二者结合。 相应的启动文…

基于Redis、Storm的实时数据查询实践

通过算法小组给出的聚合文件&#xff0c;我们需要实现一种业务场景&#xff0c;通过用户的消费地点的商户ID与posId&#xff0c;查询出他所在的商圈&#xff0c;并通过商圈地点查询出与该区域的做活动的商户&#xff0c;并与之进行消息匹配&#xff0c;推送相应活动信息到用户手…

从离散值中把值相近的放在一起

//30根细条得到30个长度值&#xff0c;选择出现值相近且出现次数最多的&#xff0c;算其均值作为输出 #include <iostream> using namespace std;int main() {double dRawdata[5] {1.1,1.2,1.3,2.5,3.2};//先升序排序double dSort[5][5] {0};double* p dRawdata;int a…

register_globals(全局变量注册开关)

register_globals&#xff0c;是php.ini文件里面的一个配置选项&#xff0c;接下来&#xff0c;我们可以通过例程来分析一下&#xff0c;当register_globals on 与 register_globals off 的时候&#xff0c;对php语言的一些安全影响。测试源代码如下&#xff1a;index.html 源…

精述IBM的MQTT协议和MQTT-S协议

一&#xff0e;MQTT简介 MQTT (Message Queuing Telemetry Transport) 是由IBM研发的构建在TCP/IP之上的简单轻量的消息协议&#xff0c;目标使用场景为受限制环境&#xff0c;如低带宽、高延迟、不可靠网络&#xff0c;很适用于M2M和IoT中。它的竞争协议包括XMPP协议和IETF的C…

20150103--SQL连接查询+视图-02

20150103--SQL连接查询视图-02 子查询 一条查询语句出现在另外一条查询语句的内部&#xff0c;这条语句就被称之为子查询语句。 子查询分类 子查询可以根据子查询返回的结果以及子查询出现的位置两种方式进行分类 按结果分类&#xff1a; 标量子查询&#xff1a;子查询返回的结…

QtQuick controls和controls2 自定义样式

2019独角兽企业重金招聘Python工程师标准>>> controls import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Rectangle {color: "green"Button {id:buttontext: qsTr("Second page")anchors.centerIn: parentpr…

电脑开机3秒就重启循环_电脑修好后客户不愿支付上门费,行,那电脑开机60秒自动关机吧!...

上门维修电脑已经非常普及了&#xff0c;上门维修电脑费用要比送修(送到维修店)费用高&#xff0c;送修电脑只有一项维修费用&#xff0c;上门维修电脑比送修多了一项费用&#xff0c;这项费用就是上门费。有人说维修电脑收取上门费用不合理&#xff0c;其实这样的说法非常自私…

jQuery属性筛选选择器

2019独角兽企业重金招聘Python工程师标准>>> 代码一 <h2>属性筛选选择器</h2><h3>[attval]、[att]、[att|val]、[att~val]</h3><div class"left" testattr"true" ><div class"div" testattr"t…

java 代码优化

Java程序中的内存管理机制是通过GC完成的&#xff0c;“一个对象创建后被放置在JVM的堆内存中&#xff0c;当永远不在应用这个对象的时候将会被JVM在堆内存中回收。被创建的对象不能再生&#xff0c;同时也没有办法通过程序语句释放”&#xff08;这个是《Java的GC机制》中提到…

Halcon中OCR的实现及关键函数解析

OCR的实现共分为两步&#xff0c;1是使用字符数据来训练OCR。2是使用OCR进行字符的识别。 训练分类器 训练分类器共分为4步&#xff1a; 1是使用阈值来分割字符区域&#xff1b; 2是调用append_ocr_trainf函数将字符加入训练集&#xff1b; 3是创建分类器&#xff1b; 4是…

MATLAB 长度和像素_Matlab中短时傅里叶变换 spectrogram和stft的用法

在Matlab中&#xff0c;做短时傅里叶变换需要使用函数spectrogram&#xff0c;而在Matlab2019中&#xff0c;引入了一个新的函数stft&#xff0c;下面我们就来看下这两个函数都如何使用。短时傅里叶变换的基本原理就是将数据分段加窗&#xff0c;做fft&#xff0c;在分段时会有…

Qt 【关于控件样式,鼠标进入、离开、点击】

比如举以下这个例子: QPushButton * okBtn; okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}"); //这个是最常规的样式 okBtn->setstylesheet("QPushButton{border-image:url(:/image/hello);}" //…