什么是设计模式:人们在长期的软件开发中对一些经验的总结。是某些特定问题经过实践检验的特定的解决办法。
软件设计有一个原则就是封装变化点。将程序中经常变化的部分封装起来,可以降低类和类之间的耦合性。
简单工厂模式实现代码:
public class Factory{ public static Pizza CreatePizza(String type){ Pizza pizza=null; switch(type){ case "奶酪": pizza=new CheesePizza(); break; case "培根": pizza=new BaconPizza(); break; default: break; } return pizza; } }
单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
1.饿汉式单例类
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //已经自行实例化 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; }
2.懒汉式单例类
//懒汉式单例类.在第一次调用的时候实例化 public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single=null; //静态工厂方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
3.登记式单例类
import java.util.HashMap; 2 import java.util.Map; 3 //登记式单例类. 4 //类似Spring里面的方法,将类名注册,下次从里面直接获取。 5 public class Singleton3 { 6 private static Map<String,Singleton3> map = new HashMap<String,Singleton3>(); 7 static{ 8 Singleton3 single = new Singleton3(); 9 map.put(single.getClass().getName(), single); 10 } 11 //保护的默认构造子 12 protected Singleton3(){} 13 //静态工厂方法,返还此类惟一的实例 14 public static Singleton3 getInstance(String name) { 15 if(name == null) { 16 name = Singleton3.class.getName(); 17 System.out.println("name == null"+"--->name="+name); 18 } 19 if(map.get(name) == null) { 20 try { 21 map.put(name, (Singleton3) Class.forName(name).newInstance()); 22 } catch (InstantiationException e) { 23 e.printStackTrace(); 24 } catch (IllegalAccessException e) { 25 e.printStackTrace(); 26 } catch (ClassNotFoundException e) { 27 e.printStackTrace(); 28 } 29 } 30 return map.get(name); 31 } 32 //一个示意性的商业方法 33 public String about() { 34 return "Hello, I am RegSingleton."; 35 } 36 public static void main(String[] args) { 37 Singleton3 single3 = Singleton3.getInstance(null); 38 System.out.println(single3.about()); 39 } 40 }