首页 > 代码库 > 设计模式

设计模式

常见的设计模式

一、单例模式 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();

       }

设计模式