单例模式 一个类只允许产生一个对象
//1.饿汉式
class ClassA{
private static final ClassA ca = new ClassA();
private ClassA(){}
private static ClassA getInstance(){
return ca;
}
}
//2.懒汉式
class ClassB{
private static ClassB cb = null;
private ClassB(){}
public static synchronized ClassB getInstance(){
if(cb == null) cb = new ClassB();
return cb;
}
}
class ClassC{
private ClassC(){}
private static class Inner{
static ClassC cc = new ClassC();
}
public static ClassC getInstance(){
return Inner.cc;
}
}
开闭原则:对修改关闭,对扩展开放
工厂设计模式
版本1:定义一个方法,生产对象 -> 工厂
public static Animal createNewObject(){
return new Cat();
}
版本2:由工厂根据参数的不同,创建不同的对象
public static Animal createNewObject(int i){
if(i == 0)return new Cat();
else if(i == 0) return new Dog();
return null;
}
版本3:利用反射,根据类名让工厂创建对象
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
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完成配置文件的读取
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;
}