设计模式总结与归纳

JDK源码中用到了哪些设计模式/h1>

1.Singleton(单例)
作用:保证类只有一个实例;提供一个全局访问点
JDK中体现:
(1)Runtime
(2)NumberFormat

3.Factory Method(工厂方法)
作用:子类决定哪一个类实例化
JDK中体现:Collection.iterator方法

5.Builder(构造者)
作用:
(1)将构造逻辑提到单独的类中
(2)分离类的构造逻辑和表现
JDK中体现:DocumentBuilder(org.w3c.dom)

7.Adapter(适配器)
作用:使不兼容的接口相容
JDK中体现:
(1)java.io.InputStreamReader(InputStream)
(2)java.io.OutputStreamWriter(OutputStream)

9.Composite(组合)

作用:一致地对待组合对象和独立对象
JDK中体现:
(1)org.w3c.dom
(2)javax.swing.JComponent#add(Component)

11.Fade(外观)

作用:
(1)封装一组交互类,一致地对外提供接口
(2)封装子系统,简化子系统调用
JDK中体现:java.util.logging包

**14.Proxy(代理)
**作用:
(1)透明调用被代理对象,无须知道复杂实现细节
(2)增加被代理类的功能
JDK中体现:动态代理;RMI

等…

具体可以查看JDK中设计模式

静态代理模式和动态代理模式的区别

静态代理和动态代理:
1、静态代理:代理类由程序员创建的然后编译成.class文件。但是其中缺点是,具有重复代码,灵活性不好,例如在执行接口A中所有方法之前加上日志逻辑,那么使用静态代理的话,在代理类中每个方法都得加,如果我想add* 开头方法加上一种逻辑,select* 开头方法加上另一种逻辑,那么就很难去实现和维护了,想解决以上困惑就要使用动态代理了。

2、动态代理:是在运行的时候,通过jvm中的反射进行动态创建对象,生成字节码对象(构造方法参数 InvocationHandler h类型),传入由我们实现InvocationHandler接口的对象,通过反射创建代理对象。 然后当调用代理对象的任何方法都会调用h中的 invoke(Object proxy,Method method,Object[] args)传入当前代理对象、当前调用的方法、方法参数值。

静态: 由程序员创建代理类。在程序运行前要代理的对象就已经指定了。

动态: 在程序运行时运用反射机制动态创建而成。(InvocationHandler的应用)

谈一谈,开发中都用到了 哪些设计模式用在什么场合/h2>

把老哥B站上讲设计模式那个视频看了

Spring单例和Java单例(设计模式)有什么区别/h2>

Java单例由Java类加载器确定范围,Spring单例由容器上下文确定范围。

从根本上讲,这意味着在Java中,可以确保单例仅在加载它的类加载器的上下文中才是真正的单例。尽管您在代码中尽力防止它发生,但其他类加载器也应该能够创建它的另一个实例(前提是这些类加载器不在同一类加载器层次结构中)。

在Spring中,如果您可以在两个不同的上下文中加载单例类,然后再次打破单例概念。

因此,总而言之,如果Java无法在给定的类加载器中创建该类的多个实例,则Java将其视为一个单例,而如果Java无法在给定的容器/中创建一个类的多个实例,则Spring将其视为一个单例。上下文。

设计模式概述

设计模式,代表了最佳的实践,通常被用经验的面向对象的软件开发人员所采用,是软件开发人员在参与软件开发时使用的一系列的解决方案

设计模式的四种类型

1.1

3.3

设计模6大原则,以及哪些设计模式遵循了哪些原则

(1)单一职责原则:

理解: 不同的类具备不同的职责,各司其职。做系统设计是,如果发现有一个类拥有了两种职责,那么就要问一个问题:可以将这个类分成两个类吗果真的有必要,那就分开,千万不要让一个类干的事情太多。

(2)开放封闭原则

理解: 类、模块、函数,可以去扩展,但不要去修改。如果要修改代码,尽量用继承或组合的方式来扩展类的功能,而不是直接修改类的代码。当然,如果能保证对整个架构不会产生任何影响,那就没必要搞的那么复杂,直接改这个类吧。

总结: 对软件实体的改动,最好用扩展而非修改的方式。

(3)里式替换原则

理解: 父类可被子类替换,但反之不一定成立。也就是说,代码中可以将父类全部替换为子类,程序不会出现异常,但反过来就不一定了。

总结: 在继承类是,务必重写(override)父类中所有的方法,尤其需要注意父类的protected方法(它们往往是让你重写的),子类尽量不要暴露自己的public方法供外界调用。

(4)最少知识原则

理解: 尽量减少对象之间的交互,从而减小类之间的耦合。在做系统设计时,不要让一个类依赖于太多其他的类,需尽量减小依赖关系,否则死都不知道怎么死的。

总结: 一定要做到:低耦合、高内聚。

(5)接口隔离原则

理解: 不要对外暴露没有实际意义的接口。也就是说,尽量保证接口的实用性。当需要对外暴露接口时,需要再三斟酌,若没必要对外提供就删了吧,因为一旦提供了就意味着,将来要多做一件事情,何苦给自己找事做呢。

总结: 不要对外暴露没有实际意义的接口。

(6)依赖倒置原则

理解: 高层模块不应该依赖于底层模块,而应该依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。应该面向接口编程,不该面向实现类编程。面向实现类编程相当于就事论事,那是正向依赖;面向接口编程,相当于透过现象看本质,抓住事务的共性,那就是反向依赖,即依赖倒置。

总结: 面向接口编程,提取出事务的本质和共性。

工厂模式和简单工厂模式的区别

1、简单工厂模式中包含判断什么对象的逻辑,而工厂方法模式则需要调用者判断要实例化什么具体类型的工厂进而创建出想要的对象。

2、当增加新类时,简单工厂模式需要修改工厂类,而工厂方法模式不需要,因此工厂方法模式遵守了开闭原则,而简单工厂模式没遵守。

3、简单工厂模式因为采用了静态方法,所以不利于继承,而工厂方法模式恰恰相反,需要利用到继承来从抽象工厂中派生出各种各样的具体工厂。

1.简单工厂模式

简单工厂模式属于创造型模式,又叫做静态工厂方法模式,它属于类创建型模式,在简单工厂模式中,可以根据参数的不同返回不同类的实例。

简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

介绍

优点: 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;

这些缺点在工厂方法模式中得到了一定的克服。

使用场景:

工厂类负责创建的对象比较少;

客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;

由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

实现

  • Factory:工厂类,简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

  • IProduct:抽象产品类,简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

  • Product:具体产品类,是简单工厂模式的创建目标。

创建工厂类

  • 步骤四

客户端调用工厂类

第二种实现方法

为了节省内存和对象创建的实践,我们可以将parser事先创建好缓存起来

2. 工厂模式

工厂模式是Java程序设计中最常用的设计模式之一,属于创造性模式,它提供了一种创造对象的最佳方式。

在工厂模式中,我们创造对象不会对客户端暴露逻辑,而是通过一个共同的接口来指向新创建的对象

介绍

**意图:**定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

**主要解决:**主要解决接口选择的问题。

**何时使用:**我们明确地计划不同条件下创建不同实例时。

**如何解决:**让其子类实现工厂接口,返回的也是一个抽象的产品。

**关键代码:**创建过程在其子类执行。

应用实例: 1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。 2、Hibernate 换数据库只需换方言和驱动就可以。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

使用场景: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,“POP3”、“IMAP”、“HTTP”,可以把这三个作为产品类,共同实现一个接口。

**注意事项:**作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory

FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

创建一个工厂,生成基于给定信息的实体类的对象

  • 步骤四

使用该工厂,通过传递类型消息来获取实体类的对象

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年2月22日
下一篇 2021年2月22日

相关推荐