一个jpa引发的血案,项目中应用的jpa比较多,自己看了关于jpa相关的应用,然后打算了解一些源码,但是不太能看懂。想知道为什么在jpa中定义了方法,就能够操作数据库,不定义方法也能操作数据库,资料上说应用的代理设计模式,自己看过一些设计模式,但是并没有太理解。自己又着重看了看代理设计模式,好像还是看不懂,然后跟身边的一个大神,大学的好哥们交流,咨询了一下,代理模式的实现原理。在学技术的时候我走入了一个误区,感觉想深入的学习某项技术就应该了解源码,了解源码是没有问题,但是我们应该从宏观的角度看待问题、了解问题。例如代理模式,我们应用都会用,也都会去了解源码,但是它是怎么实现代理的呢,我了解这个实现过程的时候就是直接去看底层的源码,但是越看好像越迷糊,之所以这样是因为我们没有站在正确的角度看待问题,如果我们知道代理模式是如何实现的,那么了解代理模式的原理就没有那么费劲了,虽然我看问题的角度可能对了,但是学艺不精,仅仅了解一些皮毛呀!我会在以后的博客中介绍代理模式的。
由jpa引起我的一些列要看的东西,反射->代理模式->工厂模式->反射的一系列应用->JPA原理->AOP原理等,希望能全部更新成博客,所以可能最近多更新一些博客。
只有在用到某项的时候,细细琢磨才会发现一些其中的强大,希望大家多多进步,如果有问题希望不吝赐教。

  • 概述
  • 简单工厂模式
  • 工厂模式
  • 抽象工厂模式
概述

我暂时还没有理解这个工厂模式的所有,只有在特定的场合下这个工厂模式的威力才能展现出来。工厂模式有三种基本形式,当然实现的方式是多样的,
顾名思义,工厂是生产衣服,零件之类的比较多,在这里工厂模式就一个作用,产生对象的。工厂里的产品就是具体的对象,产生对象的地方就是工厂,工厂模式属于创建型设计模式。
下面篇幅我都用的定义:产品工厂->生产具体的产品、产品->具体的产品、产品抽象类->定义某一类产品的和产品工厂是不同的、抽象工厂->产生产品对象的工厂。

简单工厂模式
  • 场景介绍:首先定义产品抽象类Car、Boat,那么的产品类别就定了两个,如下的产品就属于这两个类别了,然后定义几个具体的产品。抽象工厂类可以产品这两类产品了(实际上这里并不是的类并不是抽象的,是一个实际的类用于产生具体的产品)
  • UML展示类与类之间的关系:用网上的工具画的,还挺好用的,我觉类图有助于理解类与类之间的关系,遇到复杂的类,我觉得画画这个还是挺有用的。

-code:这里我只展示部分,我会把git地址留下。

public class StaticFactory {/*** CarFactory是一个静态工厂类,初始化只有一个Benz类型的车* @return*/public Car getBenz(){return new Benz();}/*** 增加同种类型的车*/public Car getBwm(){return new Bwm();}/*** 工厂类中增加带参数的不同种类的产品,只需要在工厂类中增加一条即可*/public Boat getBoat(String size){return new Yacht(size);}}//test类StaticFactory staticFactory = new StaticFactory();staticFactory.getBenz().type();
  • 用法:用一个类用来生成的对象,这个类就是工厂类,它的作用就是产生具体的产品对象,而每一个具体的产品对象,都会在工厂类中初始化,在工厂类中动态的决定生成那个具体产品的对象。
  • 增加与删除产品时:在工厂类中增加或者删除对应的产品的对象,增加的产品可以是一类产品,也可不是一类产品。
  • 优劣势:
    1)看着类图就会感觉到,其实这个类与类之间的关系太复杂了,类的内聚性太差了,当某个具体的产品类发生改变时,抽象工厂类也需要修改。
    2)对于初始化对象来说确实还是比较方便的。
    3)扩展性也很好。
  • 应用介绍:在spring beanFactory中的应用

    在spring在xml中配置bean的相关信息,首先spring容器会读取配置文件,将所有的bean初始成对应的对象,并给每个对象起一个名字,然后存入到Map中,map是的键是类的名字,value是bean,这里的bean也就是要创建的具体的产品的对象,这里产品可以有多种,利用map.contain(“key”)方法获取具体的产品的信息,这里产品可以有多种,利用map.contain(“key”)方法获取具体的产品的信息。

工厂模式
  • 场景介绍:(每一个模式我都会重新定义场景,有助于理解),定义一个产品抽象类Car、该类产品具体产品、具体的产品工厂类(一个产品对应一个产品工厂类)、抽象工厂类(一类产品对应一个抽象工厂)。

  • UML展示类与类之间的关系:

    当增加一类产品时,就相当于把这个图重新画一遍。开发的时候也是一样的。
    -code:

//抽象工厂
public abstract  class CarFactoryPattern {public abstract Car getCar();/*** 如果在原有抽象工厂中直接增加一个类型,其他的所有具体的产品产生工厂都需要早呢更加一个类型,* 这个类型这个产品也能产生呀,所以就不能增加了,需要新增抽象产品工厂* public abstract Boat getBoat();* @return*/}
//产品工厂
public class BenzFactory extends CarFactoryPattern {@Overridepublic Car getCar() {return new Benz();}
}//testCarFactoryPattern carFactoryPattern = new BenzFactory();carFactoryPattern.getCar().type();
  • 用法:同类产品存在同一个抽象类,每个具体的产品都存在生产该产品的工厂,该工厂用于初始化该产品的对象。抽象工厂类用于选择那种产品的工厂。
  • 增加或者删除同类的产品时:首先增加或者删除一个具体的产品,然后增加或者删除产品工厂。
  • 增加不同类的产品时:需要新增抽象工厂、产品抽象类、产品工厂、具体产品。ps:新增不同类型的好麻烦呀。
  • 如果新的产品中增加参数:也就是初始化对象的时候增加了构造方法中需要入参。那么工厂方法就不太能用了,贼麻烦。
  • 优势:
    • 产品抽象,生产的产品也抽象,当增加该类产品时,只需增加具体的产品和生产该产品的工程即可
    • 对于增减产品的操作比较方便,扩展性比较好。
    • 抽象工厂类之间的耦合性下降了,降低耦合性还是很有必要的。
抽象工厂模式
  • 场景介绍:现在有两种产品抽象类,几个具体的产品,产品工厂,现在产品工厂强大了,能够生产两种产品了,抽象工厂也是一样,能够生产两种产品了。
  • UML展示类与类之间的关系:
  • code:
//产品工厂类
public class BenzNewFactory extends FactoryPattern{@Overridepublic Car getCar() {return new Benz();}@Overridepublic Boat getBoat(String size) {return new Yacht(size);}
}
//抽象工厂类
public class BenzNewFactory extends FactoryPattern{@Overridepublic Car getCar() {return new Benz();}@Overridepublic Boat getBoat(String size) {return new Yacht(size);}
}
//testFactoryPattern factoryPattern = new BenzNewFactory();factoryPattern.getBoat("123").size();factoryPattern.getCar().type();
  • 抽象工厂模式和工厂方法模式之间的区别:从几个方面
    1)产品抽象类和具体产品(没区别):需要增加一个产品抽象类和具体的产品。
    2)产品工厂:可以产生多个产品。
    3)抽象工厂:增加一个类别的产品不需要额外的增加抽象工厂,但是增加一个类产品时,其他的不需要的类也可能增加这个产品类别。

其实看起来工厂模式没有什么东西,也容易理解,我在这里举的例子也可能不太恰当,像这种设计模式只有在特定的情况下才能发挥其优势的,虽然可能并没有体会它的深意,也要理解它。

git 地址:
https://github.com/jtracydy/SpringBootTestDemo/tree/master/src/main/java/com/demo/d/factory/own

参考博客:
http://blog.csdn.net/zxt0601/article/details/52798423
http://blog.csdn.net/zxt0601/article/details/52798423
作图工具地址 :https://www.processon.com/
UML图参考博客:http://blog.csdn.net/jtracydy/article/details/78980315

工厂模式以及应用简单解释相关推荐

  1. 你真的能解释工厂模式吗?不屑解释工厂模式的大牛不是真牛

    最近闲来无事了解了一下设计模式,得知最基本的设计模式就是工厂模式,然而从网上找了大堆的文章却总感觉不得要领,似乎很多大神级人物都不屑于讲这么"简单"的东西,因为当前业内人们似乎只对 ...

  2. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  3. 简单工厂模式练习:简单工厂模式在农场系统中实现

    目录 前言 一.简单工厂模式 二.农场系统创建 1.先新建一个包.类以及抽象类 2.键入各类中代码 1 抽象产品角色  Fruit 2 实现产品角色  Apple 3实现产品角色  Grape 4实现 ...

  4. java 工厂模式 计算器_简单工厂模式实现简易计算器

    packageFactoryMethodPattern;/*创建人:czc 创建时间:2019/12/16 创建用途:简单工厂模式实现计算器--主界面*/ import javax.swing.*;i ...

  5. 工厂模式一之简单工厂

    工厂用来生产商品,然后卖给供应商,再由供应商转手给门店,再卖给顾客 .这样的一种生产到供应的过程,看看如何应用到我们的程序中. 1.下面以衣服店为例子. 第一步:创建衣服店类. clothes.js ...

  6. 设计模式之3种工厂模式对比和简单介绍

    一.简单工厂模式 模式定义 简单工厂模式又称静态工厂模式.可以根据参数的不同返回不同类的实例.定义一个类来创建其它类的实例. 模式角色 简单工厂模式包含如下角色 Factory:工厂角色 Produc ...

  7. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

  8. python简单工厂模式_python版简单工厂模式

    什么是简单工厂模式 工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品:在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的.从软件开发的角度来说,这样就 ...

  9. HeadFirst设计模式(四) - 工厂模式之1 - 简单工厂

    2019独角兽企业重金招聘Python工程师标准>>> 为什么要使用工厂? 当看到new时,就会想到具体这个词. 是的,当使用new时,确实是在实例化一个具体累,所以用的确实是实现, ...

  10. 异星工厂--原型定义的简单解释

    MiningDrill 原型MiningDrill是Factorio游戏中的一个机器人模块,用于挖掘和收集资源. 其属性包括: mining_speed:挖掘速度,即每秒钟挖掘的资源数量. resou ...

最新文章

  1. Java项目:在线水果商城系统(java+JSP+Spring+SpringMVC +MyBatis+html+mysql)
  2. 极客新闻——02、最高效的人都是最会休息的人
  3. (转)flex中使用swc实现更好的界面代码分离
  4. ICLR 2021投稿中值得一读的NLP相关论文
  5. bootstrap-table全选当前页所有数据checkAll
  6. 项目功能大全,让你的项目一天搞定
  7. java 内存屏障_关于Java中的内存屏障
  8. JavaScript Json对象和Json对象字符串的关系 jsonObj-JsonString
  9. 酷比魔方IWork1X 的做系统问题
  10. python 画图 平滑曲线_用Python平滑曲线
  11. JavaWeb开发技术笔记(配置篇)
  12. 5613-2-冒泡排序
  13. 视频突破500播放量的神操作秘密
  14. python发post请求json_python request 以json形式发送post请求的正确的姿势
  15. PART 2.1 风控模型种类变量选择范围变量衍生特征交叉
  16. ESP8266-Arduino编程实例-PCF8563实时时钟(RTC)驱动
  17. 1.Postman之发送get请求
  18. ubunt查看网卡流量_Linux下查看网卡流量
  19. 来自 Facebook 设计副总裁的 5 个 UX 建议
  20. 计算机音乐数字乐谱桃源恋歌,桃源恋歌钢琴简谱-数字双手-GARNIDELIA

热门文章

  1. 一个乞丐的故事(强烈推荐)
  2. 流场(向量场)临界点的检测与分类
  3. python爬虫100例--酷我音乐--周杰伦歌曲(1)
  4. win10修改用户名||user中文名改英文名
  5. 方正快速开发平台ES2007(3.5版本)新增功能特点
  6. vscode中输入感叹号无法识别html模板
  7. 必须精力充沛,才扛得住世事艰难
  8. sqli-labs 前五关
  9. Java游戏项目之黄金矿工
  10. 淘宝客?CPS技术是怎么实现的?