框架的简单理解和工程模式以及单例模式

1. 框架的简单理解

框架是一套第三方编写的程序,用于解决特定的问题,在使用框架进行开发时,可能并不需要关心某些功能的实现细节,主要掌握正确的使用方式,实现编程的目标

2 . Spring框架的主要作用

Spring框架主要解决了创建对象和管理对象的问题!

2.1例1:不用框架的时候创建对象

UserDao userDao = new UserDao();

2.2例2:有依赖关系时创建对象

public class UserJdbcDao {
    
    void login() {
        // 使用JDBC技术处理用户登录
    }
    
}
public class UserLoginServlet {
    
    public UserJdbcDao userDao = new UserJdbcDao();
    
    public void doPost() {
        // 实现用户登录的处理
        userDao.login();
    }
    
}

依赖:一个类中的方法在运行时需要另一个类的对象,则称之为“依赖”另一个类的对象!以上代码中,UserLoginServlet就是依赖UserJdbcDao的!

2.3 例3:使用接口时创建对象

public interface IUserDao {
    void login();
}
public class UserJdbcDao implements IUserDao {
    @Override
    public void login() {
        // 使用JDBC技术处理用户登录
    }
}
public class UserMybatisDao implements IUserDao {
    @Override
    public void login() {
        // 使用Mybatis技术实现用户登录
    }
}

则在UserLoginServlet中,就可以改为使用接口来声明所需要的对象,例如,声明为:

public IUserDao userDao = new UserJdbcDao();
// public IUserDao userDao = new UserMybatisDao();

2.4例3 使用工厂模式来创建类的对象

public class UserDaoFactory {
    public static IUserDao newInstance() {
        return new UserMybatisDao();
    }
}

则在各个Servlet组件中,需要使用这些对象时,只需要声明为以下语句即可

public IUserDao userDao = UserDaoFactory.newInstance();

可以看到,以上代码中完全没有表现出UserJdbcDaoUserMybatisDao的类名,各Servlet组件中都使用以上代码来声明并获取对象即可,当类需要被替换时,只需要替换工厂类中方法的返回值即可,在各Servlet中使用到的以上代码是不需要调整的!

3.单例设计模式

单例模式(Singleton),保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    单例模式有很多好处,比如可节约系统内存空间,控制资源的使用。

3.1 饿汉式

    package cn.tedu.thread;
        //设计模式
        public class Test4_Design {
            public static void main(String[] args) {
                MySingleTon m = MySingleTon.getMy() ;
                MySingleTon m2 = MySingleTon.getMy() ;
                //==比较基本类型的值,比的是值本身 1==2
                //==比较引用类型的值,比的是地址值
                //equals()到底比啥?
                    // -- 如果不重写,使用Object提供的equals(),就是 == 比的,比对象间的地址值
                    // -- 如果重写了equals() , 比对象间的属性值
                System.out.println(m == m2) ;
                //true --实现了单例,两次getMy()调用返回了同一个对象
            }
        }
        class MySingleTon {
            //1,私有化构造方法
            private MySingleTon(){ }
            //2,自己创建对象
            //加static是因为--静态资源getMy(),关联的资源必须也得是静态的--静态只能调用静态
            static private MySingleTon my = new MySingleTon() ;
            //3,设置全局访问点
            //加static是因为--无法通过对象访问getMy(),只能通过类名.调用了
            static public MySingleTon getMy(){
                return my ;//把 my 返回给调用位置
            }
        }

3.2 懒汉式

//懒汉式 ----- 面试的重点!!!

    //延迟加载,什么时候需要什么时候才会加载
    //线程安全的隐患 --共享资源my ,被多条语句操作 --加锁牺牲效率但是保证安全
    class MySingleTon2 {
        //1,私有化构造方法
        private MySingleTon2(){ }
        //2,自己创建对象
        //加static是因为--静态资源getMy(),关联的资源必须也得是静态的--静态只能调用静态
        static private MySingleTon2 my ;
        //3,设置全局访问点
        //加static是因为--无法通过对象访问getMy(),只能通过类名.调用了
    //5,同步方法,如果是静态方法,会自动分配锁对象是类名.class.如果是普通方法,分配的锁对象是this
    //synchronized static public MySingleTon2 getMy(){
        static public MySingleTon2 getMy(){
            //4,同步代码块的锁对象可以任意.但是如果共享资源是静态的,锁对象必须是固定的类名.class
            synchronized ( MySingleTon2.class ){
                if (my == null) {//增强了代码的健壮性
                    my = new MySingleTon2() ;
                }
                return my ;//把 my 返回给调用位置
            }
        }
    }

//懒汉式 ----- 面试的重点!!!

    //延迟加载,什么时候需要什么时候才会加载
    //线程安全的隐患 --共享资源my ,被多条语句操作 --加锁牺牲效率但是保证安全

4 单例模式注解

//@Scope("prototype")//prototype表示多例作用域,此类实例与Lazy无关,默认何时需要何时创建,并且不会存储到spring的对象池

//@Scope //@Scope注解用于定义对象作用域,默认为单例(Singleton)作用域(一个JVM内存中名字相同的Bean只能有一个-Key相同的Bean)

//@Lazy //描述的类的对象可以延迟其创建,何时需要何时创建(按需加载)

@Component

public class ObjectPool {

    public ObjectPool(){

        System.out.println("ObjectPool()");

    }

    @PostConstruct

    public void init(){

        System.out.println("init()");

    }

    @PreDestroy

    public void destroy(){

        System.out.println("destroy()");

    }

}

你可能感兴趣的:(程序员)