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

Java常用设计模式(面试常考),第1张

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

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

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

(2)应用场景:

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

(3)示例代码:

简单版(饿汉模式):

public class Singleton {

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

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

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

        return instance;

    }

}

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

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)示例代码:

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)示例:

//接口

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5681466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存