前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java常用设计模式(面试常考)

Java常用设计模式(面试常考)

作者头像
用户10175992
发布2022-11-15 13:38:18
2670
发布2022-11-15 13:38:18
举报
文章被收录于专栏:辰远辰远

设计模式——Singleton(单例模式)

(1)定义:在程序运行期间,确保类的实例只有一个,并且提供了一个公共的入口点。实现的思路就是将构造函数私有,并且提供一个全局静态的方法返回一个实例。

(2)应用场景:

多线程中的线程池、应用程序的日志对象、数据库的连接池、应用的配置对象、缓存等常常被设计成单例。

(3)示例代码:

简单版(饿汉模式):

代码语言:javascript
复制
public class Singleton {

    private static Singleton instance = new Singleton(); //饿汉模式:立即初始化

    private Singleton() { }                                              //私有化构造器

    public static Singleton getInstance() {                      //提供公有的单例访问点

        return instance;

    }

}

双重检查版(懒汉模式):

代码语言:javascript
复制
public class Singleton{

    private volatile static Singleton instance;   //懒汉模式:延时到用时才初始化

    private Singleton() { }

    public static Singleton getInstance() {

        if(instance==null) {

            synchronized (Singleton.class) {  //块避免多线程并发,同步块+双重检查

                if(instance==null)              

                    instance = new Singleton();

            }

        }

        return instance;

    }

}

设计模式——Simple Factory(简单工厂)设计模式

(1)定义:提供一个抽象产品(父类),由一个工厂类根据当前环境决定创建出哪一种实际产品(子类)的实例。

(2)应用场合:

Spring中作为DI容器使用时,可以看作就是一个工厂。又如Spring事务处理时需要一个抽象的产品“事务管理器”——PlatformTransactionManager,实际配置的则是具体的事务管理,如HibernateTransactionManager或者是DataSourceTransactionManager。当然Spring本身的功能非常复杂,用到的远远不仅是简单工厂一个模式。

(3)示例代码:

代码语言:javascript
复制
interface Vehicle{        //车辆抽象父类

    void run();

}

class Car implements Vehicle{    //小轿车子类

    public void run() {

        System.out.println("---小车在行驶---");

    }

}

class Tank implements Vehicle{  //坦克子类

    public void run() {

        System.out.println("---轰隆隆,坦克在行驶---");

    }

}

class Factory{                             //工厂类

    public static Vehicle getVehicle(String name) {

        if("tank".equals(name)) {             //根据条件返回子类

            return new Tank();

        }else {

            return new Car();

        }

    }

}

设计模式——Proxy(代理)模式

(1)定义:创造一个代理类出来,包装并替原对象进行操作。

(2)应用场景:

拦截器、AOP和ORM的懒加载等地方都使用了代理模式。

(3)示例:

代码语言:javascript
复制
//接口

public interface UserDao{

       void save();

}

//目标类

public class UserDaoImpl implements UserDao{

       public void save(){

              System.out.println("保存用户");

       }

}

//代理类

public class UserDaoProxy implements UserDao{

       private UserDao target;

       public void setTarget(UserDao userDao){

              this.target = userDao;

       }

       public void save(){

              System.out.println("---预处理---");         //注入增强代码

              this.target.save();

              System.out.println("---后处理---");         //注入增强代码

       }

}

想要学习更多的基础开发知识和可能遇到的面试问题可以看我另外一篇文章: 原文链接:https://blog.csdn.net/qq_55917018/article/details/122187021

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档