设计模式

2020-05-18  本文已影响0人  技术灭霸

1、讲你最熟悉的设计模式、项目中使用的设计模式?

最熟悉的设计模式

项目中使用的设计模式

2、抽象类一般使用什么模式?

模版模式

3、模版方法一般使用什么场景?

Java IO InputStream,JDK自带的很多工具类都运用了某些设计模式,其中JavaIO中的InputStream这个抽象类中有3个实现了相类似功能的度read()方法。

4、接口一般使用什么模式?

工厂模式,代理模式

5、静态工厂和实例工厂的区别?

静态工厂方法

就是直接可以通过静态方法来实例化一个对象

public class HelloWorldFactory {
    public static HelloWorld getInstance(){
        return new HelloWorld();
    }
}
HelloWorldFactory.getInstance()

创建 HelloWorld 对象直接可以调用getInstance方法来进行实现

实例工厂方法

就是先创建类对象,如何通过对象来调用创建实例对象的方法

public class HelloWorldFactory {
    public HelloWorld createHelloWorld(){
        return new HelloWorld();
    }
}
HelloWorldFactory helloFactory = new HelloWorldFactory();
helloFactory.createHelloWorld();

抽象工厂模式

介绍

提供一个接口,用于创建相关的对象家族。

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂方法模式只是用于创建一个对象,这和抽象工厂模式有很大不同。

代码

JDK

适配器模式

介绍

将一个类的接口变换成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类功购在一起工作。

建造者模式

介绍

封装一个对象的构造过程,并允许按步骤构造。

JDK

责任链模式

介绍

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.

JDK

命令模式

介绍

将命令封装成对象中,具有以下作用:

JDK

组合模式

介绍

将对象组合成树形结构来表示"整体/部分"层次关系,允许用户以相同的方式处理单独对象和组合对象

JDK

装饰模式

介绍

动态地给一个对象添加一些额外的指责,就添加功能来说,装饰模式相比生成子类更为灵活

外观模式

介绍

提供了一个统一的接口,用来访问子系统中的一群接口,从而让子系统更容易使用。

工厂方法模式

介绍

定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。

工厂方法模式设计到一下四个角色的概念:

  1. 抽象工厂角色
    工厂方法模式的核心,创建产品的类必须实现该接口
  2. 具体工厂角色
    该角色实现了抽象工厂接口,具体如何创建产品就是在该类中实现
  3. 抽象产品角色
    所有产品的超类,负责实现产品共性的抽象定义
  4. 具体产品角色
    该角色实现了抽象产品接口,负责具体不同产品的业务逻辑

JDK

建造者模式

介绍

它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节

JDK

中介者模式

介绍

集中相关对象之间复杂的沟通和控制方式。

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地互相作用,从而使其耦合松散,而且可以独立地改变他们的交互

JDK

备忘录模式

介绍

在不违背封装的情况下获取对象的内部状态,从而在需要时可以将对象恢复到最初状态

JDK

原型模式

介绍

使用原型实例指定要创建对象的类型,通过复制这个原型来创建新对象。

JDK

代理模式

介绍

为其他对象提供一种代理以控制对这个对象的访问

代理模式一般涉及到的角色有:

抽象角色:声明真实对象和代理对象的共同接口;

代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。

真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

JDK

单例模式

介绍

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

代码

public class Singleton {
    private Singleton() {
    }

    private static class SingletonInstance {
        private static final Singleton INSTANCE = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonInstance.INSTANCE;
    }
}

优点

  1. 单例模式内存只有一个实例,减少了内存开销,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。
  2. 避免对资源的多重占用
  3. 单例模式可以在系统设置全局的访问点,优化和共享资源访问

缺点

  1. 由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
  2. 在并行开发环境,如果单例模式没有完成,是不能进行测试。
  3. 单例类的职责过重,在一定程度上违背了“单一职责原则”。
  4. 滥用单例将带来一些负面的问题,如为了节省资源将数据库连接池对象设计为单例模式,可能会导致共享连接池对象的程序过多未出而出现的连接池溢出,如果实例化对象长时间不用系统就会被认为垃圾对象被回收,这将导致对象状态丢失。

应用场景

  1. 外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件
  2. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~
  3. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。
  4. 网站的计数器,一般也是采用单例模式实现,否则难以同步。
  5. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
  6. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。
  7. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。
  8. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
  9. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
  10. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.

策略模式

介绍

定义一系列算法,封装每个算法,并使它们可以互换。

策略模式可以让算法独立于使用它的客户端。

JDK

模版方法模式

介绍

定义算法框架,并将一些步骤的实现延迟到子类。

通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的结构。

JDK

上一篇下一篇

猜你喜欢

热点阅读