Head First Design Mode(5)-工厂模式

2023-11-11

该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!

 

工厂模式:    

    烘烤OO的精华——烘烤某些松耦合的OO设计;

    除了使用new操作符之外,还有更多制造对象的方法;

    本章我们将了解到实例化的这个活动不应该总是公开的进行,认识到初始化经常造成“耦合”问题,并了解工厂模式如何从复杂的依赖中帮你脱困;

 

new——具体:

    每次使用new的时候都是在针对实现编程,因为它实例化了一个具体 的类;

    我们知道代码绑定具体类会导致代码更脆弱,更缺乏弹性;

    我们可能会根据if条件判断类在运行时具体需要实例化哪个子类;

    

new的问题:

    new并没有问题,问题在于“改变”影像了new的使用;

    在为一个父类变量赋值时,所有实例化子类的情形会根据不同的条件进行,这就是一种改变,直到运行时你才会直到具体实例化的是哪个子类;

    而这种改变会造成耦合,比如条件的修改,新增子类的实例化等,这些都需要修改代码;

 

我们的代码没有“对修改关闭”,用新的具体来扩展代码,必须重新打开它;

 

我们的设计原则:

    对扩展开放 对修改关闭;

    那我们先将变化分类出来:将实例化具体类的代码从应用中抽离,或者封装,使他们不会干扰应用的其他部分;

 

我们以比萨店的场景进行举例:

    你有一家 比萨店,顾客可以对比萨进行下单;

    

我们编码如下:

 

现在需要更多的比萨类型,我们将orderPizza方法加上一个类型的参数:String type;

    进而在orderPizza方法中通过type.equals(“sometype")进行if条件判断,实例化不同的Pizza子类型,赋值给Pizza pizza变量;

    这里可以将Pizza定义为一个接口,所有的Pizza子类型都需实现该接口;

    在实例化具体的pizza之后,我们继续进行比萨的准备-烘烤-切片-装盒!

 

这种设计的问题 在更多的比萨类型新增 或 减少时就会提现出来:

    随着比萨菜单的修改,orderPizza方法中的这样一段if条件下多个实例化,必须一再修改;

    这将导致,无法让orderPizza()对修改关闭;

 

我们可已经这段变化的代码移到一个专门的类中,这个类只管创建Pizza,我们将这个类的对象称之为“工厂”;

 

工厂(factory):

    处理创建对象的细节,如果有一个SimplePizzaFactory,那么orderPizza()就变成此对象的客户;

    当客户下单,pizzaStore调用orderPizza()的时候,就叫比萨工厂做一个,orderPizza()只关心从工厂得到一个比萨;

    这个比萨(类)实现了Pizza接口,可以调用prepare bake cut box进行对应的操作;

 

提前熟悉下,我们会学习到三种工厂相关的模式:

    简单工厂模式(更像一种编程习惯);

    工厂方法模式;

    抽象工厂模式;

 

工厂的好处:

    一个工厂可以有很多的客户,工厂封装了根据条件创建对象这一“变化”的过程,当需要变更时,修改此类即可;

 

简单工厂模式——:

 

现在我们根据上述思路重新实现PizzaStore类:

    我们把new操作符替换成工厂对象的创建方法;

 

编译运行:

bogon:简单工厂模式(更像一种编程习惯) huaqiang$ java SimplePizzaDriver

PizzaSub1 init!

PizzaSub1 prepare!

PizzaSub1 bake!

PizzaSub1 cut!

PizzaSub1 box!

 

定义简单工厂:

    上述编码示例,对应的就是简单工厂,相比于称之为设计模式,更像一种编程习惯,由于使用的比较多,我们称之为 简单工厂模式;

    其中的SimplePizzaFactory的createPizza()方法也通常声明为静态;

    工厂生产的产品定义为具体类,同一实现了相同的接口,被工厂创建之后返回给客户;    

    “实现一个接口”泛指“实现某个超类型”(可以是类或接口);

 

类图如下:

 

经过简单工厂模式的热身,我们继续介绍两个重量级的模式,他们都是工厂;

 

工厂方法模式——:

 

加盟比萨店:

    加盟店可以利用我们已有比萨店的代码,让比萨的流程一致,毕竟我们是连锁店;

        一家加盟店能制造北方口味的比萨:厚饼 重味道的酱料 大量的芝士;

        一家加盟店能制造南方口味的比萨:薄饼 轻味道的酱料 少量的芝士;

 

为了让加盟店和比萨的创建绑定在一起实现一定的质量控制,又想让比萨的口味设置保持一定的弹性,我们需要“框架”:

    目标:

        让比萨制作活动局限于PizzaStore类,同时又能让这些加盟店依然可以自由地制作该区域的风味;

    方案:

        把createPizza()方法放回到PizzaStore中,不过要把它设置为“抽象方法”,然后为每一个区域创建一个PizzaStore的子类;

 

我们编码如下:

 

编译运行:

bogon:工厂方法模式 huaqiang$ javac *.java

bogon:工厂方法模式 huaqiang$ java FactoryMethodDriver

PizzaSub1 init!

PizzaSub1 prepare!

PizzaSub1 bake!

PizzaSub1 cut!

PizzaSub1 box!

 

我们用了一个PizzaStore的超类,每个区域的比萨店都继承这个PizzaStore,每个子类各自决定如何制造比萨;

    “不变的”内容,统一定在了抽象超类中;

    “变的”内容,则由子类覆盖父类方法;

 

各个区域的比萨店之间的差异在于他们制作比萨的风味,现在要让createPizza()能够应对这些变化来负责创建正确的种类的比萨——让PizzaStore的各个子类负责定义自己的createPizza()方法;我们得到了一些PizzaStore具体的子类,每个子类都有自己的制作比萨的变体,而仍然适合PizzaStore框架,并使用调试好的orderPizza()方法;

 

解耦:

    orderPizza()方法对Pizza对象做了许多事情(准备 烘烤 切片 装盒);但由于Pizza对象是抽象的,orderPizza()并不知道那些实际的具体类参与进来,这就是解耦;

    相应的pizza也是调用createPizza()取得的,具体做的是哪一种比萨,由具体的比萨店来决定;

 

新开一家比萨店:

    继承PizzaStore,然后提供createPizza()方法实现自己的比萨风味即可;

    超类的orderPizza()方法,并不知道正在创建的比萨是哪一种,他只知道这个比萨可以被准备、烘烤、切片、装盒;

 

声明一个工厂方法:

    我们再仔细看下加盟比萨店的示例;

    相比于简单工厂模式由一个对象负责所有具体类的实例化,现在通过对PizzaStore做的一些修改,变成由一群子类来负责实例化;

    实例化比萨的责任被移到了一个“方法”中,此方法就如同是一个“工厂”;

 

工厂方法用来处理对象的创建,并将这样的行为封装在子类中,这样,客户程序中关于超类的代码就和子类对象创建代码解耦了;

    abstract Product factoryMethod(String type);

        工厂方法是抽象的,所以用子类来处理对象的创建;

        工厂方法必须返回一个产品,超类中的其他方法,通常用到工厂方法的返回值;

        工厂方法将客户(超类中)和实际创建产品的代码分隔开来;

 

不要忽略“比萨”本身:

    Pizza可以是一个抽象超类,也可以定义为接口;

    我们具体的比萨类,扩展自Pizza;

 

比萨加盟店的实例 和 我们上述的说明 对应的就是 工厂方法模式 的一个应用场景和说明;

 

认识工厂方法模式:

    所有的工厂模式都是用来封装对象的创建;

    工厂方法模式(Factory Method Pattern)通过让子类决定该创建的对象是什么,来达到将对象的创建过程封装的目的;

 

类图:

    创建者(Creater)类:

        创建者通常会包含依赖于抽象产品的代码,而这些抽象产品由子类制造;

        创建者不需要真的知道在制造那种具体产品;

 

    产品(Product)类:

 

创建者和产品:

    将一个orderPizza()方法和一个工厂方法联合起来,就可以成为一个框架;

    此外,工厂方法将生产知识封装进哥哥创建者,这种做法也可以被视为一个框架;

 

创建者和产品类层级是平行的:

    它们都有各自的抽象类,各自的抽象类 还有许多具体的子类,每个子类都有自己特定的实现;

        创建者的子类封装创建产品子类的知识;

        创建者的抽象类关联使用产品抽象类的知识;

 

定义工厂方法模式:

    正式定义:

        工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个;工厂方法让类把实例化推迟到子类;

    工厂方法模式能够封装具体类型的实例化;

        抽象的Creater提供了一个创建对象的方法的接口,成为“工厂方法”;在抽象的Creater中,任何其他市县的方法,都可以使用到这个工厂方法所制

造的产品,但只有子类真正实现这个工厂方法并创建产品(选择类子类,自然就决定了实际创建的产品);

 

工厂方法模式类图:

 

优点:

    将产品的实现从使用中解耦,增加改变产品的实现,Creater并不会受到影响,因为Creater和任何的ConcreteProduct之间不是紧耦合;

    工厂方法不一定是抽象的,我们也可以定义一个默认的工厂方法来产生某些具体的产品;

    和简单工厂模式相比,简单工厂的做法可已经对象的创建封装起来,但是简单工厂不具备工厂方法的弹性,因为简单工厂不能变更正在创建的产品;

    将创建对象的代码集中在一个对象或方法中,可以避免代码中的重复,方便维护;客户实例化对象只会依赖接口,而不是具体的类;帮助我们针对接口编程,而不针对实现接口,让代码更具有弹性,方便今后扩展;

 

让我们假设下,如果不使用工厂模式的类设计会如何?

    PizzaStore_1->PizzaStoreSub_N->PizzaSub_N;

    一个比萨店类会依赖多个具体的比萨店,每个比萨店 又要依赖 具体的比萨类型,这就导致 如果一个比萨的实现改变了,最终可能会影响到PizzaStore;

    这种依赖并不是我们想要的,我们有一个OO原则,来阐明这一点;

 

依赖导致原则(Dependency Inversion Principle):

    要依赖抽象,不要依赖具体类;

 

此原则说明了:不要让高层组件依赖底层组件,而且,不管高层或底层组件,“两者”都应该依赖于抽象;

    高层组件:是由其他底层组件定义其行为的类;PizzaStore就是一个高层组件,因为他的行为是由比萨定义的;

 

工厂方法模式就是对这一原则的应用:

    PizzaStore依赖每个Pizza类型,虽然已经抽象了一个Pizza,但是PizzaStore还是依赖了具体的Pizza类,应为在其orderPizza()方法中,更具条件实例化了具体的Pizza类型,所以这个抽象并没有什么影响力;

    而工厂方法刚好将实例化代码的代码独立了出来;

    遵循依赖倒置原则,工厂方法不是唯一的,确实最有效的;

 

遵循依赖倒置原则的指导方针:

    1)变量不可以持有具体类的引用;(使用new就会持有具体类的引用)

    2)不要让类派生自具体类;(派生自具体类就会依赖具体类,所以请派生一个抽象(接口或抽象类))

    3)不要覆盖基类中已实现的方法;(基类已实现的方法应该由所有子类共享,否则就不是一个合适的抽象)

 

抽象工厂模式——:

 

再看比萨店——如何确保原料的一致性

    比萨的加盟店要求使用相同的配料,以保证品质,但是不同的比萨店可能会从各自所在地区进行原材料的采集;

    显然,南方的酱料 不同于 北方的酱料,其他的材料也不尽相同;

 

原料家族会不断壮大,虽然每个加盟店的比萨配料名称一致,但是不同的比萨店的配料都会有各自品种的特点;

 

所有对乡村的比萨都是使用相同的组件制成的,但是每个区域对于这些组件却有不同的实现;

 

建造原料工厂:

    我们建一个工厂来生产原料,负责创建家族中每一种原料,比如生产酱料和面团;

    我们先为工厂定义一个接口:PizzaIngredientFactory;其中定义了各种创建原料的方法;

        那么,为每一个区域创建一个工厂,就可以创建继承/实现PizzaIngredientFactory的子类/具体类;

        这些类,也可以在合适的区域间共享(PizzaIngredientFactory需要是一个抽象类);

    新的方案就是,将新的原料工厂整合进旧的PizzaStore代码中;

        创建PizzaStoreSub1所在区域的原料工厂-PizzaIngredientFactorySub1;

        现在原料和 原料工厂 都已经准备好了,注意原料也可以抽象为原料接口,这里的场景名不复杂就不继续抽象了;

 

重做比萨:

    通过原料工厂实现Pizza和原料之间的解耦;    

    把工厂传递给每一个比萨,以便比萨能从工厂中取得原料;

 

我们发现:

    上述类图中既有我们已经学习的工厂方法模式,也有我们即将介绍的抽象工厂模式;

    二者两种模式,其实都是从简单工厂模式演化而来的:

        简单工厂模式中的Factory类,如果移到了客户类成为一个抽象方法,有其子类提供创建,对应的就是 工厂方法模式;

        简单工厂模式中的Factory类,如果抽象为一个接口,由其子类提供创建原料家族的实现,对应的就是 抽象工厂模式;

    

我们继续往下看:

    我们引入新类型的工厂,也就是所谓的抽象工厂,来创建比萨原料家族;

    通过抽象工厂所提供的接口,可以创建产品的家族,利用这个接口编码,代码实现实际工厂解耦;

 

定义抽象工厂模式:

    抽象工厂模式提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类;

 

就好像子类的prepare()中所做的(图中方法错误 应去掉 abstract前缀);

 

类图:

    客户需要ProductA1和ProductB1,只需要使用一个具体的工厂取创建即可,而不需要实例化任何产品对象;

 

可以看到:

    抽象工厂定义了一个负责创建一组产品的接口,抽象工厂的子类提供具体的方法,其中使用了多个工厂方法;

    当需要创建产品家族和想让制造的相关产品集合起来时,可以使用抽象工厂;

    工厂方法则可以把客户代码从需要实例化的具体类中解耦,如果还不知道需要实例化哪些具体的类可使用,继承为子类然后实现工厂方法即可;

 

总结:

1.所有的工厂都是用来封装对象的创建;

2.简单工厂,虽然不是真正的设计模式,但仍不失为一个简单方法,可以将客户程序从具体类中解耦;

3.工厂方法使用继承:把对象的创建委托给子类,子类实现工厂方法来创建对象;

4.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中;

5.所有工厂模式都通过减少应用程序和具体类之间的依赖促进松耦合;

6.工厂方法允许类将实例化延迟到子类进行;

7.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类;

8.依赖倒置原则,指导我们避免依赖具体类型,而尽量依赖抽象;

9.工厂很厉害,帮助我们更好的针对抽象编程,而不是针对具体类编程;

 

OO基础:

    抽象;

    封装

    继承;

    多态;

OO原则:

    封装变化

    多用组合,少用继承

    针对接口编程,不针对实现编程

    为交互对象之间的松耦合设计而努力;

    类应该对扩展开放,对修改关闭;

    ——依赖抽象,不要依赖具体类;

OO模式:

    策略模式:定义算法族,分别封装起来,让他们之间互相替换,此模式让算法的变化独立于使用算法的客户;

    观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新;

    装饰者模式:动态地将责任附加到对象上;想要扩展功能,装饰者提供有别于继承的另一种选择;

    ——简单工厂模式;

    ——工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个;工厂方法让类把实例化推迟到子类;

    ——抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确具体的类;

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Head First Design Mode(5)-工厂模式 的相关文章

  • Head First Design Mode(2)-设计模式入门(策略模式)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 设计模式入门 欢迎来到设计模式世界 我们会看到设计模式的用途和优点 再看看关键的OO原则 通过实例来了解模式是如何运作的 以往是代码复用 现在是经验复用 模拟鸭子的应
  • 创建型模式 - 单例模式

    核心 严谨起见 私有构造必须要加 避免外部创建新的实例 特性 单例类只能有一个实例 单例类必须自己创建自己的唯一实例 单例类必须给所有其他对象提供这一实例 常用的几种单例模式写法 懒汉方式 双重锁方式 静态类方式 每种方式对应的特性 方式
  • Head First Design Mode(12)-状态模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 状态模式 状态模式和策略模式是 双胞胎 在出生时才分开 策略模式是围绕可以互换的算法来创建成功业务的 状态模式则是通过改变对象内部的状态来帮助对象控制自己的行为 状态
  • Java设计模式(24):策略模式

    24 策略模式 Strategy 24 1 问题引入 鸭子问题 有各种鸭子 如 北京鸭 野鸭 玩具鸭 鸭子存在各种行为 如 叫 游泳 飞行等 需要做一个程序 显示鸭子的各种信息 在传统方案中 通过定义一个抽象的 Duck 类 用具体鸭子类继
  • Java 动态代理和静态代理 详解(结合代码实列)

    文章目录 Java 动态代理和静态代理的区别 下面是一个结合代码示例 运行上述代码 输出如下 总结 Java 动态代理和静态代理的区别 动态代理和静态代理是两种不同的代理模式 它们在代理对象的创建和使用方式上有所不同 静态代理 静态代理是在
  • 我去公司面试,人事经理面试没有过,我却把责任链模式学会了

    设计模式在开发当中是运用特别多的 设计模式就是参照我们日常生活特性 抽象出特性 从而某种实现达到具体要求 当然这当中一定是灵活转变 责任链正式拉开序幕 我去某某互联网公司去面试 好的方向的流程大致应该是 你上招聘软件投递简历 简历筛选通过
  • 单元测试中的打桩技术

    一 桩是什么 桩 或称桩代码 是指用来代替关联代码或者未实现代码的代码 如果用函数B1来代替B 那么 B称为原函数 B1称为桩函数 打桩就是编写或生成桩代码 二 打桩的用途 打桩的目的主要有 隔离 补齐 控制 隔离是指将测试任务从产品项目中
  • java设计模式——策略模式(Strategy Pattern)

    概述 在策略模式中 我们可以定义一些独立的类来封装不同的算法 每一个类封装一种具体的算法 在这里 每一个封装算法的类我们都可以称之为一种策略 Strategy 为了保证这些策略在使用时具有一致性 一般会提供一个抽象的策略类来做规则的定义 而
  • Java设计模式(9):桥接模式

    9 桥接模式 Bridge 9 1 问题引入 手机类型 现在对不同类型不同品牌的手机实现操作编程 如下手机外观类型和对应品牌 则需要编写的代码类图可能如下 带来的问题如下 如果我们需要添加一个手机 则需要在各个类型下添加手机 如果我们需要添
  • java设计模式——享元模式(Flyweight Pattern)

    概述 面向对象技术可以很好地解决一些灵活性或可扩展性问题 但在很多情况下需要在系统中增加类和对象的个数 当对象数量太多时 将导致运行代价过高 带来性能下降等问题 享元模式正是为解决这一类问题而诞生的 享元模式通过共享技术实现相同或相似对象的
  • Java之美[从菜鸟到高手演变]之设计模式四

    在阅读过程中有任何问题 请及时联系 egg 邮箱 xtfggef gmail com 微博 http weibo com xtfggef 转载请说明出处 http blog csdn net zhangerqing 其实每个设计模式都是很重
  • 软件设计模式----访问者模式

    访问者模式 模式动机 对于系统中的某些对象 它们存储在同一个集合中 且具有不同的类型 而且对于该集合中的对象 可以接受一类称为访问者的对象来访问 而且不同的访问者其访问方式有所不同 访问者模式为解决这类问题而诞生 在实际使用时 对同一集合对
  • 工厂模式--Factory Method with Go

    Factory Method 工厂设计模式允许创建对象 而无需指定将要创建的对象的确切类型 Implementation 举个栗子 用个例子展示怎么把数据存储在不同的后端 比如 内存 磁盘 Types type 一个Store interf
  • Java设计模式-解释器模式

    解释器模式 在软件开发中 会遇到有些问题多次重复出现 而且有一定的相似性和规律性 如果将它们归纳成一种简单的语言 那么这些问题实例将是该语言的一些句子 这样就可以用 编译原理 中的解释器模式来实现了 虽然使用解释器模式的实例不是很多 但对于
  • 一、创建型模式:工厂方法模式(Factory Method)

    请MM去麦当劳吃汉堡 不同的MM有不同的口味 要每个都记住是一件烦人的事情 我一般采用Factory Method模式 带着MM到服务员那儿 说 要一个汉堡 具体要什么样的汉堡呢 让MM直接跟服务员说就行了 定义 核心工厂类不再负责所有产品
  • 【JAVA设计模式】之桥接模式(BridgePattern)

    桥接模式的作用是将两样东西连接起来 比如桥梁把河的两岸连接起来 桥接模式把 类的功能层次结构 和 类的实现层次结构 连接起来 类的层次结构 类的功能层次 父类通过定义抽象方法来定义接口API 类的实现层次 子类通过实现具体方法来实现接口AP
  • java设计模式——简单工厂模式(Simple Factory Pattern)

    定义 简单工厂模式 Simple Factory Pattern 又称为静态工厂方法 Static Factory Method 模式 它属于类创建型模式 在简单工 厂模 式中 可以根据参数的不同返回不同类的实例 结构 Factory 工厂
  • Java设计模式-结构型设计模式-适配器模式

    Java设计模式 结构型设计模式 适配器模式 从这一专栏开始将学习设计模式 上课学习和自己总结归纳的笔记将总结出来供大家参考 参考书籍 设计模式就该这样学 其他文章 Java设计模式 UML类图 Java设计模式 七大架构设计原则 开闭原则
  • JavaScript的设计模式解析——工厂模式

    这几天一直在看 JavaScript高级程序设计 在第六章面向对象的程序设计中 自我感觉对于小白而而言 会一定程度的难以理解 什么意思啊 根本不明白哇等等 注意 大神请略过 小小码农 不敢妄言 首先 我们开门见山 什么是工厂模式 工厂模式能
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa

随机推荐

  • 面向对象的语言

    面向对象的语言 面向过程和面向对象的设计思想 面向过程 procedure oriented programming 缩写POP 分析出解决问题所需的步骤 然后把步骤一部哟不实现 面向对象语言 Object Oriented Languag
  • IT项目管理大作业技术报告

    大作业项目中承担的角色 第一次团队作业项目前期研究 第一个是 中大人IT生活攻略 描述目前应用情况 另一个是 中大人的移动生活攻略 描述Program实现后的美好生活 第二次团队作业调查与研究 云或移动项目管理服务软件 竞品分析 调查Wor
  • 通过PIL打开图片并显示

    输入 from PIL import Image import matplotlib pyplot as plt pil im Image open 1 jpg pil im Image open 1 jpg convert L 灰度操作
  • Mysql中如何截取json字符串中指定片段再对其进行模糊查询--SUBSTRING_INDEX(s, delimiter, number)函数的实战运用

    应用场景 给你一个表单信息的字符串 如下 数据1 checkbox 1611194769273 Option 1 Option 2 checkbox 1611194771312 Option 2 Option 3 数据2 checkbox
  • 认识smack中的基本对象 - Registration

    一 Registration类的介绍 Registration是信息查询包IQ的子类 所以它也包含表示操作类型的四个属性 GET SET等 当其类型属性为GET时 表示从服务器获取注册对象的信息 而SET类型则表示创建用户 或者是更新已有用
  • 万能密码学习

    select userid from cms users where username 用户名 and password md5 密码 如上 如果知道用户名 注入类型为字符型使用admin and 1 1 即可完成绕过验证 数字型省去闭合即
  • build.gradle详解

    简述 1 gt java开发中有两个大名鼎鼎的项目构建ANT Maven 2 gt Google推荐使用的Android Studio是采用Gradle来构建项目的 Gradle是一个非常先进的项目构建工具 Gradle是用了一种基于Gro
  • 性能测试的基本流程

    本文主要介绍下性能测试的基本流程 性能测试从实际执行层面来看 测试的过程一般分为这么几个阶段 如下图 下面分别介绍下每个阶段具体需要做什么 一 性能需求分析 性能需求分析是整个性能测试工作开展的基础 如果连性能的需求都没弄清楚 后面的性能测
  • 数据库中存储过程、函数、触发器的区别

    存储过程 函数 触发器的区别 比较项目 存储过程 函数 是否有返回值 可以有 也可以没有 必须有且只有一个 是否可以单独执行 可以 必须通过execute执行 SQL语句 DML或SELECT 可否调用 不可以 可以 且可以位于FROM关键
  • MySQL导入frm文件

    前几天我心爱的Windows Server 2003系统忽然崩溃里面装的东西全完了 还好我是装双系统的 还能有个系统用用 在恢复过程中试了很多办法都不行哦 后来去百度搜索一下 mysql导入frm文件 终于找到办法了 现在把这些记在这里 以
  • python获取文件后缀名及批量更新目录下文件后缀名的方法

    coding utf 8 import os 获取文件后缀名称 dict 存放文件后缀名 path r E test for dirpath dirnames filenames in os walk path for filename i
  • QT容器详解

    QString类 隐式共享 隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作 隐式数据共享类当作为函数参数传递的时候 不仅安全而且效率很高 因为传递的时候只是传递了数据的指针 数据本身只当自己被修改的时候才会去复制 简称写时复制 数
  • vue引入vue-jsonp实现解决跨域(例:在项目里调用百度api/腾讯api获取定位)

    第一步 添加依赖npm install vue jsonp save 第二步 在vue cli项目main js中添加 import VueJsonp from vue jsonp 网上很多博客引用不加 会报错 Vue use VueJso
  • 基于STL的演讲流程管理系统

    完整项目代码已上传gitCode 地址 https gitcode net m0 46663240 stl 1 system pause 按任意键之后才会执行下一步 system cls 清屏 2 vector 清空函数 clear 3 s
  • 各类学习资料(网址)汇总~

    移动开发设计 英文 http davidbcalhoun com 2010 viewport metatag 伯乐论坛http blog jobbole com 这里面的东西感觉好有难度 保存起来再看 什么是响应式网站设计 http www
  • 区块链体系架构

    区块链技术经过多年的发展 它们在实现上各有不同 但是在整体架构上是大体上相同的 区块链平台整体上可以划分为网络层 共识层 数据层 智能合约层以及应用层五个部分 一 网络层 区块链平台通常选择完全分布式且可容忍单点故障的P2P协议作为网络传输
  • Mysql load data local命令详解

    1 load data local命令使用方法 不指定字段名 此写法数据文件内字段数必须跟数据库表一致 load data local infile C test txt into table tableName CHARACTER SET
  • python Elasticsearch update

    备注 如果更新没有成功 原因有几个 1 更改字段在实际中没有 2 多层结构要用用字典来更新 不能用car color方式更新 res es update index index doc type doc type id data id bo
  • 【linux】定时任务讲解

    文章目录 一 在某时刻只执行一次 at 1 设置定时任务 2 查看和删除定时任务 二 周期性执行任务 cron 1 启动crond进程 2 编辑定时任务 3 查看和删除 4 用户权限 4 1 黑名单 4 2指定用户 三 etc cronta
  • Head First Design Mode(5)-工厂模式

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 工厂模式 烘烤OO的精华 烘烤某些松耦合的OO设计 除了使用new操作符之外 还有更多制造对象的方法 本章我们将了解到实例化的这个活动不应该总是公开的进行 认识到初始