首页 > 其他分享 >设计模式

设计模式

时间:2023-02-17 10:44:26浏览次数:27  
标签:对象 接口 工厂 实例 模式 单例 设计模式

说一说设计模式的六大原则

单一职责原则

一个类,应当只有一个引起它变化的原因;即一个类应该只有一个原则。

就一个类而言,应该只专注于做一件事和仅有一个引起变化的原因,着就是所谓的单一职责原则。该原则提出了对对象职责的一种理想状态,对象不应该承担太多职责,正如人不应该一心分为二用。唯有专注,才能保证对象的高内聚;唯有单一才能保证对象的细粒度。对象的高内聚和细粒度有利于对象的重用。

里氏替换原则

所有引用基类的地方必须能透明地使用其子类对象。清晰明确的说明只要父类能出现的地方子类就可以出现,而且替换为子类也不会产生任何错误和异常,使用者可以根本就不需要知道是父类还是子类;但是反过来不可以,有子类的地方,替换为父类就未必适应。

依赖倒置原则

依赖倒置原则包括三种含义: • 高层模块不应该依赖低层模块,两者都依赖其抽象; • 抽象不依赖细节; • 细节应该依赖于抽象。 传统的过程性系统的设计办法倾向于高层次的模块依赖于低层次的模块;抽象层次依赖于具体层次。“倒置”原则将这个错误的依赖关系倒置了过来,如下图所示,由此命名为“依赖倒置原则”。

 

在Java语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的;细节就是具体的实现类,实现类实现了接口或者继承了抽象类,其特点是可以直接被实例化的。依赖倒置原则在Java语言中的表现是:

(1)模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生;

(2)接口或抽象类不依赖于实现类;

(3)实现类依赖于接口或抽象类。

依赖倒置原则更加精确的定义就是”面向接口编程“————OOD(Object-Oriented Design)的精髓之一。依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,降低并行开发引起的风险,提高代码的可读性和可维护性。依赖倒置原则是JavaBean,EJB和COM等组件设计模型背后的基本原则。

接口隔离原则

接口隔离原则有如下两种定义:

(1)客户端不应该依赖它不需要的接口;

(2)类间的依赖关系应该建立在最小的接口上。

接口隔离原则的具体含义如下:

(1)一个类对另外一个类的依赖性应当是建立在最小的接口上。

(2)一个接口代表一个角色,不应当将不同的角色都交给一个接口。

(3)不应该强迫客户依赖于他们不用的方法。

迪米特法则

迪米特法则又称为最少知识原则,意思是一个对象应当对其他对象尽可能少的了解。迪米特法则不同于其他的OO设计原则,它具有很多的表述方式:

(1)只与你直接的朋友们通信;

(2)不要跟”陌生人说话“;

(3)每个软件单位对其他的单位都只有最少的了解,这些了解仅局限于那些与本单位密切相关的软件单位。

按照迪米特法则,如果两个类不必彼此直接通信,那么两个类就不应当发生直接的相互作用;如果一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。

开闭原则

开闭原则的定义是:一个软件实体应当对扩展开放,对修改关闭。在设计一个模块的时候,应当使这个模块在可以不被修改的前提下被扩展,即应当可以在不必修改源代码的情况下改变这个模块的行为。

在面向对象的编程中,开闭原则是最基础的原则,起到总的指导作用,其他原则(单一职责、里氏替换、依赖倒置、接口隔 离、迪米特法则)都是开闭原则的具体形态,即其他原则都是开闭原则的手段和工具。开闭原则的重要性可以通过以下几个 方面来体现。

单例模式

 饿汉式单例模式

public class Singleton {
    private static Singleton instance = new Singleton();
    //私有构造方法,保证外界无法直接实例化
    private Singleton(){}
    //通过公有静态方法获取实例对象
    public static Singleton getInstance(){
        return instance;
    }
}

懒汉式单例模式

public class Singleton {
    private static Singleton instance = null;
    //私有构造方法,保证外界无法直接实例化
    private Singleton(){}
    //通过公有静态方法获取实例对象
    public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}

线程安全的单例模式

public class Singleton {
    private static Singleton instance = null;
    //私有构造方法,保证外界无法直接实例化
    private Singleton(){}
    //通过公有静态方法获取实例对象
    synchronized public static Singleton getInstance(){
        if(instance == null){
            instance = new Singleton();
        }
        return instance;
    }
}
上述代码对静态方法 getInstance()进行同步,以确保多线程环境下只创建一个实例。如果getInstance()方法未被同步,并且线程A和线程B同时调用此方法,则执行if (instance == null)语句时都为真,那么线程A和线程B都会创建一个对象,在内存中就会出现两个对象,这样就违反了单例模式。而使用synchronized关键字进行同步后,则不会出现此种情况。

 单例模式优点:

(1)在单例模式中,活动的单例只有一个实例,对单例的所有实例化得到的都是相同的一个实例。这样就,防止其他对象对自己的实例化,确保所有对象都访问一个实例。

(2)提供了对唯一实例的受控访问。

(3)由于系统内存中只存在一个对象,因此可以节约系统资源,当需要频繁创建和销毁的对象时单例模式无疑可以提高系统的性能。

(4)避免对共享资源的多重占用。

缺点:

(1)不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。

(2)由于单例模式没有抽象层,因此单例类的扩展有很大的困难。

(3)单例类的职责过重,在一定程度上违背了”单一职责原则‘。

(4)使用时不能用反射模式创建单例,否则会实例化一个新的对象。

工厂模式

 工厂模式的用意是定义一个创建对象的工厂接口,将实际创建性工作推迟到子类中。工厂模式可以分为简单工厂、工厂方法和抽象工厂模式。注意,我们常说的23种经典设计模式,包含了工厂方法模式和抽象工厂模式,而并未包含简单工厂模式。

简单工厂

简单工厂模式其实并不是一种设计模式,更多的时候是一种编程习惯。简单工厂的实现思路是,定义一个工厂类,根据传入参数的不同返回不同的实例,被创建的实例具有共同的父类或接口。

 

 为工厂类传入不同的type可以new不同的形状,返回结果为shape类型,这个就是简单工厂核心的地方了。

工厂方法

工厂方法模式是简单工厂的进一步深化,在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。工厂方法的实现思路是,定义一个用于创建对象的接口,让子类决定将哪一个实例化。

和简单工厂对比一下,最根本的区别在于,简单工厂只有一个统一的工厂类,而工厂方法是针对每个要创建的对象都会提供一个工厂类,这些工厂类都实现了一个工厂基类。

抽象工厂

这个模式最不好理解,而且在实际应用中局限性也蛮大的,因为这个模式并不符合开闭原则。实际开发还需要做好权衡。抽象工厂模式是一个工厂方法的进一步深化,这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象,这是和工厂方法最大的不同点。

抽象工厂的实现思路是,提供一个创建一些列相关或相互依赖对象的接口,而无需指定他们具体的类。抽象工厂和工厂方法一样可以划分为4大部分。

 

 

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

简单工厂模式其实并不算是一种设计模式,更多的时候是一种编程习惯。简单工厂的实现思路是,定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。 (一个工厂创建几种对象) 工厂方法模式是简单工厂的进一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说每个对象都有一个与之对应的工厂。工厂方法的实现思路是,定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。 (多个工厂,不同的工厂创建不同的对象) 抽象工厂模式是工厂方法的进一步深化,在这个模式中的工厂类不单单可以创建一个对象,而是可以创建一组对象。这是和工厂方法最大的不同点。抽象工厂的实现思路是,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

 (多个工厂,一个工厂可以创建一组对象)

 Spring框架中用到了哪些设计模式?

 

①简单工厂 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 ②工厂方法 实现了FactoryBean接口的bean是一类叫做factory的bean。其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean的getOjbect()方法的返回值。 ③单例模式 Spring依赖注入Bean实例默认是单例的。Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。getBean的doGetBean方法调用getSingleton进行bean的创建。 ④适配器模式 SpringMVC中的适配器HandlerAdatper,它会根据Handler规则执行不同的Handler。即DispatcherServlet根据HandlerMapping返回的handler,向HandlerAdatper发起请求处理Handler。HandlerAdapter根据规则找到对应的Handler并让其执行,执行完毕后Handler会向HandlerAdapter返回一个ModelAndView,最后由HandlerAdapter向DispatchServelet返回一个ModelAndView。 ⑤代理模式 AOP底层就是动态代理模式的实现。即:切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象创建动态的创建一个代理对象。SpringAOP就是以这种方式织入切面的。 ⑥策略模式 Spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,Spring 框架本身大量使用了 Resource 接口来访问底层资源。Resource 接口是具体资源访问策略的抽象,也是所有资源访问类所实现的接口。  

 

 

 

 

 

 

 

 

 

 

标签:对象,接口,工厂,实例,模式,单例,设计模式
From: https://www.cnblogs.com/baifeili/p/17126113.html

相关文章

  • 设计模式(八)----创建型模式之建造者模式与工厂模式区别
    1、工厂方法模式VS建造者模式工厂方法模式注重的是整体对象的创建方式;而建造者模式注重的是部件构建的过程,意在通过一步一步地精确构造创建出一个复杂的对象。我们举个简......
  • 设计模式(九)----结构型模式之代理模式
    一、结构型模式结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制或者实现机制来组织接口和类,后者釆用组合或......
  • 48-单例设计模式
    ●单例模式应用实例步骤如下:1)构造器私有化=》防止直接new2)类的内部创建对象3)向外暴露一个静态的公共方法。getInstance饿汉式publicclassTest{publicst......
  • 什么是python的设计模式
    一.什么是python的设计模式?软件工程中,设计模式是指软件设计问题的推荐方案。设计模式一般是描述如何组织代码和使用最佳实践来解决常见的设计问题。需谨记一点:设计模......
  • Spring-设计模式
    1.1开闭原则开闭原则(open-closedprinciple,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调用抽......
  • 再有人问你抽象工厂设计模式,把这篇文章丢给他
    概述抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一组产品。抽象工厂模式定义如下:抽象工......
  • js设计模式
    实体展现(系统本身)工具(设计模式)基础(组织模块,设计沟通,代码质量)设计模式创建型(创建元素)工厂:生产同类型商品建造者:独立生产商品单例:vue-router结构......
  • 写给准备跳槽的小伙伴们的设计模式——工厂方法设计模式
    概述工厂方法模式(FactoryMethod),定义一个创建产品对象的工厂接口,让工厂子类决定实例化那一个产品类。我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果......
  • 设计模式之模版方法模式的钩子方法
     publicabstractclassSoyaMilk{//模版方法可以做成finaL,不让子类去覆盖finalvoidmake(){select();if(customerWantCondiments()){......
  • 代理设计模式
    代理设计模式​​1、代理设计模式​​​​1.1静态代理模式​​​​1.2动态代理模式​​1、代理设计模式  所谓代理,就是替别人完成一些事情。在Java开发中,我们也会遇到一......