乐趣区

关于程序员:框架的简单理解和工程模式以及单例模式

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 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 懒汉式

package cn.tedu.thread;
        // 设计模式
        // 总结
        //1, 单例设计模式, 是一套通过经验总结的开发过程.
            /*
                -- 私有化构造方法
                -- 在类的外部创立好对象
                -- 提供公共的全局拜访点
             */
        //2, 有两种实现办法, 饿汉式  懒汉式.
        //3, 饿汉式更方便使用(SSM 框架也采纳这种办法) , 懒汉式才是面试重点
        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()调用返回了同一个对象

                Runtime r = Runtime.getRuntime();
                Runtime r2 = Runtime.getRuntime();
                System.out.println(r==r2);

            }
        }

// 懒汉式 —– 面试的重点!!!

    // 提早加载, 什么时候须要什么时候才会加载
    // 线程平安的隐患 -- 共享资源 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()");

    }

}
退出移动版