常用的JAVA设计模式

大家好,我是老唐。今天给同学们带来的是Java设计模式的简单讲解。

 OK,今天带给大家的是本帅的浴照,希望大家把持住。

什么是设计模式呢?在我的理解里就是 先人们在敲代码时的总结,就是在解决代码问题以及提高代码质量的一系列套路,这就被称为设计模式。

设计模式的六大原则:开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,迪米特法则,合成复用原则。

我们今天说的是设计模式中最常见的几种。

一:创建模式

        1:单例模式

                (1)饿汉模式

        优点:线程安全、执行效率比较高。

        缺点:所有对象类加载的时候就实例化。浪费内存资源。

 

         我们这里通过把构造器私有化,在外部我们就没有办法去new一个对象,只能通过getInstance()方法获取,我们这里也能看到h1和h2通过getInstance()获取的对象是同一个对象。

                (2)懒汉模式

        优点:资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法。

        缺点:第一次加载时不够快,多线程使用不必要的同步开销大

         懒汉模式在单线程没有问题,在多线程就可能会出现多个对象的情况,为了避免这种情况的发生,就出现了双重检验模式。

                (3)双重检验模式

        优点:线程安全,且效率高的。

        缺点:并不能保证它会在单处理器或多处理器计算机上顺利运行。

 

        第一次判断是否为null:
        第一次判断是在Synchronized同步代码块外,理由是单例模式只会创建一个实例,并通过getInstance方法返回singleton对象,所以如果已经创建了singleton对象,就不用进入同步代码块,不用竞争锁,直接返回前面创建的实例即可,这样大大提升效率。

        第二次判断singleton是否为null:
                第二次判断原因是为了保证同步,假若线程A通过了第一次判断,进入了同步代码块,但是还未执行,线程B就进来了(线程B获得CPU时间片),线程B也通过了第一次判断(线程A并未创建实例,所以B通过了第一次判断),准备进入同步代码块,假若这个时候不判断,就会存在这种情况:线程B创建了实例,此时恰好A也获得执行时间片,如果不加以判断,那么线程A也会创建一个实例,就会造成多实例的情况。

                (4)内部类实现模式

        优点:线程安全,利用静态内部类特点实现延迟加载,效率高。

        

         类的静态属性只会在第一次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行初始化时,别的线程是无法进入的。

                (5)枚举实现模式

        优点:线程安全,调用效率高,不能延时加载

        缺点:不可继承。

         通过提供序列化和线程安全并且几行代码搞定,说明枚举单例模式是java5之后创建单例最好的方法。

        2:工厂模式

                        (1)简单工厂模式

            

使用步骤

        创建抽象产品类 , 定义具体产品的公共接口

        

 

        创建具体产品类(继承抽象产品类),定义生产的具体产品

 

        创建工厂类,通过创建静态方法根据传入不同参数从而创建不同具体产品类的实例

 

        外界通过调用工厂类的静态方法,传入不同参数从而创建不同具体产品类的实例

应用场景:客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时,当工厂类负责创建的对象(具体产品)比较少时。

                (2)工厂方法模式

使用步骤

        创建抽象工厂类和抽象产品类

                

        创建具体产品类和具体工厂类继承抽象类

 

                

 

         外界通过调用具体工厂类的方法,从而创建不同具体产品类的实例

 

应用场景:

1 当一个类不知道它所需要的对象的类时 
在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可;

2 当一个类希望通过其子类来指定创建对象时 
在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

3 将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。

                (3)抽象工厂模式

使用步骤:

        创建产品接口跟具体产品

         创建工厂接口跟具体工厂

         测试

 

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口

        2:原型设计模式

原型模式,在java中使用浅克隆时,当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制;而使用深克隆时,除了对象本身被复制外,对象所包含的所有成员变量也将被复制。

       

                (1)浅克隆

        浅克隆: 被Clone的对象的所有变量都含有原来对象相同的值,而引用变量还是原来对用的引用

使用步骤

        创建两个类,第二个类实现Cloneable接口并重写Clone()方法并且把第一个类传入。

 

         测试

 

                (2)深克隆

        使用步骤

        创建两个类实现Serializable接口

 

         测试

原型模式适合于当一个类初始化需要消耗很多资源时,有很多相似对象时,可以设计一个原型,通过对成员变量的些微修改来实现;需要时可以用深克隆的方式保存对象的状态,比如实现撤销操作等。

二:结构模式 

        1:代理模式

                (1):静态代理

        

优点:真实角色也就是业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

缺点:
1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。
2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
 

        使用步骤

        创建一个接口,再用另外一个类去实现这个接口

         创建一个代理类

        测试

 

 

                (2)动态代理之JDK代理

        使用jdk的反射机制,创建对象的能力, 创建的是代理类的对象。

        使用步骤

        创建一个接口,再用类去实现这个接口

 

         测试

 好的,这里我们看见简哥去洗个一次接近13米的jio。

        2:装饰器模式

使用步骤

创建接口,以及实现接口的实体类

创建实现了 Shape 接口的抽象装饰类。

 

 创建扩展了 ShapeDecorator 类的实体装饰类。

使用 RedShapeDecorator 来装饰 Shape 对象。

 

 

 

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

好了,这期的代码就到这里了,希望对同学们有所帮助。咱们下期见。

 

 

                                            

     

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
Java设计模式是一套对代码设计经验的总结,被人们反复利用,并且很多人都熟知的代码设计方式。其中,单例模式是一种常用设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这种模式有几个好处,比如可以节约系统资源,提高程序效率,以及提供一个全局访问点等。在实现单例模式时,可以采用饿汉式单例模式,即在类加载时创建一个对象,并通过私有构造器和静态方法来保证对象的唯一性。另外,工厂方法模式也是Java常用设计模式之一。在工厂方法模式中,可以定义一个工厂类,该类负责创建对象的实例,并将其封装在一个工厂方法中。通过这种方式,可以实现对象的创建与使用的分离,提高代码的灵活性和可维护性。总的来说,Java设计模式是一种用于解决特定问题的通用解决方案,可以提高代码的重用性、可读性和可扩展性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Java常用设计模式](https://blog.csdn.net/qq_33327680/article/details/123815614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA中23种设计模式](https://blog.csdn.net/qw_0214/article/details/78878531)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值