java中的设计模式(单例模式,工厂设计模式)

news/2024/5/19 6:39:46 标签: 设计模式, java, 反射

单例模式 一个类只允许产生一个对象

java">//1.饿汉式
class ClassA{
	private static final ClassA ca = new ClassA();
	private ClassA(){}
	private static ClassA getInstance(){
		return ca;
	}
}
java">//2.懒汉式
class ClassB{
	private static ClassB cb = null;
	private ClassB(){}
	public static synchronized ClassB getInstance(){
		if(cb == null) cb = new ClassB();
		return cb;
	}
}
java">class ClassC{
	private ClassC(){}
	private static class Inner{
		static ClassC cc = new ClassC();
	}
	public static ClassC getInstance(){
		return Inner.cc;
	}
}

开闭原则:对修改关闭,对扩展开放
工厂设计模式
版本1:定义一个方法,生产对象 -> 工厂

java">public static Animal createNewObject(){
	return new Cat();
}

版本2:由工厂根据参数的不同,创建不同的对象

java">public static Animal createNewObject(int i){
	if(i == 0)return new Cat();
	else if(i == 0) return new Dog();
	return null;
}

版本3:利用反射,根据类名让工厂创建对象

java">public static Animal createNewObject(String className){
	try{
		//通过反射创建对象
		Class c = Class.forName(className);
		Object o = c.newInstance();
		return(Animal)o;
	}catch (Exception e){
		e.printStackTrace();
		return null;	
	}
}

版本4:通过配置文件 读取className

java">public static Animal createNewObject(){
    BufferedReader br = null;
    try {
        //1. 创建字节输入流  配置文件的相对路径
        FileInputStream fis = new FileInputStream("file/config.xml");
        //2. 桥转换流
        InputStreamReader isr = new InputStreamReader(fis);
        //3. 缓冲流进行包装
        br = new BufferedReader(isr);

        String readLine = br.readLine();
        String[] strs = readLine.split("=");

        //4.通过反射创建对象
        Class c = Class.forName(strs[1]);
        Object o = c.newInstance();
        return (Animal)o;

    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }finally {
        if(br!=null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }	
        } 
    }
}

版本5:通过properties完成配置文件的读取

java">public static Animal createNewObject() throws Exception{
    //1. 创建字节输入流  配置文件的相对路径
    FileInputStream fis = new FileInputStream("file/config.xml");
    //读取配置文件的map集合
    Properties p = new Properties();
    //将流读取到的内容加载到 p集合中   =前是key  =后是value
    p.load(fis);
    String className = p.getProperty("className");
    fis.close();
    
    //通过反射  创建对象
    Class c = Class.forName(className);
    Object o = c.newInstance();
    return (Animal)o;
}

http://www.niftyadmin.cn/n/1855013.html

相关文章

MapReduce编程框架的核心实现思想

Yran: 1.任务(Job)的监控 AM applicationMaster 2.管理集群中的资源(CPU 内存 网络 IO) Yarn汇总集群中所有物理机器的资源(CPU 内存 网络) 根据不同Job作业的需要按需分配给每一个job作业&…

04-linux中svn的安装

因为自己写了一个小小的项目,在工作至于想要在公司进行开发,老是把代码复制过来复制过去,很不方便,所以研究了一下linux中的svn安装。 我使用的是阿里云的服务器,所以可以远程上传到阿里云的服务器上面。 环境说明&am…

jdbc的作用以及它的几个步骤

JDBC是一种特殊的数据库客户端应用(确切的说是连接数据库技术),其作用和其他数据库客户端应用类似(除了客户端所有功能外,还具有自己的特点),是连接数据库,使用数据库服务器提供的服…

CTF中常见注入题源码及脚本分析

1.代码审计发现 这里没有用escape_string,因此存在注入。 1 function show($username){2 global $conn;3 $sql "select role from user where username ".$username."";4 $res $conn ->query($sql);5 if($res->num_rows>0){6 echo &q…

27-SVN commit error: “'.' is not a working copy”

Make sure your working copy is not in the drive root but at least one folder below the drive root.

什么是JDBC事务?如何使用JDBC如何控制事务

oracle数据库中最小的执行单元,这个执行单元中是由多个sql语句组成,事务中的sql语句执行结果。要么全部成功,要么全部失败,它保证业务操作(功能)的完整性和正确性(一致性)&#xff0…

Servlet中的一些面试题 以及参考答案

1. Servlet的作用以及如何实现一个Servlet 答:Servlet程序是运行在Java web服务器上的java程序,servlet技术是Java EE规范的一部分,起到了生成动态网页的作用。实现步骤如下: 编写servlet类,实现接口servlet。在实际开…

28-id to load is required for loading

解决方法&#xff1a; 因为使用了自定义拦截器在action的配置文件中&#xff0c;所以如果想获取参数&#xff0c;还得声明一下默认的拦截器。 <interceptor-ref name"defaultStack"></interceptor-ref>加入到action中即可。这个感觉跟构造方法是一个原理…