常见的设计模式
一、单例模式 singleton
保证该类只可能有一个实例。通常单例模式用于对该实例共享。
或者因为该类实例较为消耗资源,一个实例足以满足应用等情况下使用。
单例步骤:
1:私有化构造方法
2:定义静态的获取当前类型实例的方法
3:定义私有的静态的当前类型实例并初始化
public class Singleton {
private Singleton(){}
private static final Singleton singleton=new Singleton();
public static Singleton getSingleton(){
return singleton;
}
}
public static void main(String[] args) {
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
System.out.println(s1==s2);//true
}
二、模板模式
定义某一个业务的流程骨架,而将不同的细节操作留给子类去实现。
public abstract class Person {
打招呼,自我介绍
public void sayHello(){
//相同的部分定义在这里
System.out.println("大家好!");
//细节的不同延迟到子类去实现
System.out.println(getInfo());
System.out.println("再见!");
}
public abstract String getInfo();
}
//学生
class Student extends Person{
public String getInfo() {
return "我是一名学生,我上了12年小学!";
}
}
class Teacher extends Person{
public String getInfo() {
return "我是一名老师,我也不知道我会什么!";
}
}
Person student = new Student();
Person teacher = new Teacher();
student.sayHello();
System.out.println();
teacher.sayHello();
三、工厂模式
"工厂"是一种设计模式。
所谓设计模式,是设计人员在面对一些相似的问题提出的一套通用的解决方案,为了方便交流,给这些解决方案命名,比如"工厂“就是一个设计模式。
工厂模式的核心思想是:工厂为调用者提供符合接口要求的对象(产品),调用者不
用了解对象的创建的细节。
案例
有一个接口:
public interface IHello {
public void sayHello();
}
有两个实现类
public class HelloEnglish implements IHello{
public void sayHello() {
System.out.println("hello");
}
}
public class HelloChinese implements IHello{
public void sayHello() {
System.out.println("吃了吗?");
}
}
业务要求:
工厂类根据我传入的接口类型,返回接口对应的实现类,可以把实现类信息写在配置信息里。
dao.properties
#IHello=day03.HelloChinese
IHello=day03.HelloEnglish
如果要把一个接口对应的实现类换一个,在配置文件里修改即可,不需要修改java代码
工厂类:
public class Factory {
private static Properties props=new Properties();
static{
try {
props.load(Factory.class.getClassLoader().
getResourceAsStream("day03/config.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object getInstance(String type){
Object obj=null;
//根据接口名称(type)找到类名
String className=props.getProperty(type);
System.out.println(className);
//根据类名创建实例,利用反射
try {
//加载类文件
Class c=Class.forName(className);
//依据方法区中的class文件,创建该类的实例
obj=c.newInstance();
} catch (ClassNotFoundException e) {
System.out.println("找不到类文件");
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
}
}
测试类:
@Test
public void testFactory() throws SQLException{
//根据接口类型返回接口对应的实现类
IHello hello=(IHello) Factory.getInstance("IHello");
hello.sayHello();
}