JAVA常用设计模式(静态化调用和实例化调用的区别,编辑可见 )

用newInstance()与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,后者是创建一个新类,且newInstance()只能调用无参构造函数。

最大的区别在于内存。
静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,
所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。
静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,
而且静态内存是有限制的,太多了程序会启动不了。

1.单例设计模式

       所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:

      (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰)。

      (2) 在其内部产生该类的实例化对象,并将其封装成private static类型。

      (3) 定义一个静态方法返回该类的实例。

         示例代码如下:

 }

一、单例模式的介绍      Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点
二、单例模式的实现
实现的方式有如下四种:

Java代码 复制代码 收藏代码
  1. /**
  2. * 单例模式的实现:饿汉式,线程安全 但效率比较低
  3. */ 
  4. public class SingletonTest {  
  5.  
  6.     private SingletonTest() {  
  7.     }  
  8.  
  9.     private static final SingletonTest instance = new SingletonTest();  
  10.  
  11.     public static SingletonTest getInstancei() {  
  12.         return instance;  
  13.     }  
  14.  
  1. /**
  2. *
  3. * 单例模式的实现:饿汉式,线程安全 但效率比较低
  4. */ 
  5. public class SingletonTest { 
  6.  
  7.     private SingletonTest() { 
  8.     } 
  9.  
  10.     private static final SingletonTest instance = new SingletonTest(); 
  11.  
  12.     public static SingletonTest getInstancei() { 
  13.         return instance; 
  14.     } 
  15.  
 

 

 

2.工厂设计模式

     简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式 。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。

 

 

 

 

interface Animal{  public void say(); } class Dog implements Animal{  public void say(){   System.out.println("A");  }  } class Cat implements Animal{  public void say(){   System.out.println("B");  } } class Factory { // 定义工厂类      public static Animal getInstance(String className) {       Animal a = null; // 定义接口对象        if ("Cat".equals(className)) { // 判断是哪个子类的标记           a = new Cat(); // 通过Cat子类实例化接口          }         if ("Dog".equals(className)) { // 判断是哪个子类的标记             a = new Dog(); // 通过Dog子类实例化接口         }          return a;     }  }

 

public class FactoryDemo {  public static void main(String[] args) {   // TODO Auto-generated method stub   Factory b =new Factory();      //  Animal  a = new  Animal();接口是不能被实例化的       Animal  a = b.getInstance("Dog"); // 通过工厂获取实例         a.say(); // 调用方法   } }

 

 

 

3.代理设计模式

       指由一个代理主题来操作真实主题,真实主题执行具体的业务操作,而代理主题负责其他相关业务的处理。比如生活中的通过代理访问网络,客户通过网络代理连接网络(具体业务),由代理服务器完成用户权限和访问限制等与上网相关的其他操作(相关业务)。

      示例代码如下:

Java代码 复制代码 收藏代码
  1. interface Network { // 定义Network接口 
  2.     public void browse(); // 定义浏览的抽象方法 
  3. }  
  4.  
  5. class Real implements Network { // 真实的上网操作 
  6.     public void browse() { // 覆写抽象方法 
  7.         System.out.println("上网浏览信息!");  
  8.     }  
  9. }  
  10.  
  11. class Proxy implements Network { // 代理上网 
  12.     private Network network;  
  13.  
  14.     public Proxy(Network network) {// 设置代理的真实操作 
  15.         this.network = network; // 设置代理的子类 
  16.     }  
  17.  
  18.     public void check() { // 身份验证操作 
  19.         System.out.println("检查用户是否合法!");  
  20.     }  
  21.  
  22.     public void browse() {  
  23.         this.check(); // 调用具体的代理业务操作 
  24.         this.network.browse(); // 调用真实的上网操作 
  25.     }  
  26. }  
  27.  
  28. public class ProxyDemo {  
  29.     public static void main(String args[]) {  
  30.         Network net = null; // 定义接口对象 
  31.         net = new Proxy(new Real()); // 实例化代理,同时传入代理的真实操作 
  32.         net.browse(); // 调用代理的上网操作  
  33.     }  
  1. interface Network { // 定义Network接口 
  2.     public void browse(); // 定义浏览的抽象方法 
  3.  
  4. class Real implements Network { // 真实的上网操作 
  5.     public void browse() { // 覆写抽象方法 
  6.         System.out.println("上网浏览信息!"); 
  7.     } 
  8.  
  9. class Proxy implements Network { // 代理上网 
  10.     private Network network; 
  11.  
  12.     public Proxy(Network network) {// 设置代理的真实操作 
  13.         this.network = network; // 设置代理的子类 
  14.     } 
  15.  
  16.     public void check() { // 身份验证操作 
  17.         System.out.println("检查用户是否合法!"); 
  18.     } 
  19.  
  20.     public void browse() { 
  21.         this.check(); // 调用具体的代理业务操作 
  22.         this.network.browse(); // 调用真实的上网操作 
  23.     } 
  24.  
  25. public class ProxyDemo { 
  26.     public static void main(String args[]) { 
  27.         Network net = null; // 定义接口对象 
  28.         net = new Proxy(new Real()); // 实例化代理,同时传入代理的真实操作 
  29.         net.browse(); // 调用代理的上网操作 
  30.     } 
interface Network { // 定义Network接口
	public void browse(); // 定义浏览的抽象方法
}

class Real implements Network { // 真实的上网操作
	public void browse() { // 覆写抽象方法
		System.out.println("上网浏览信息!");
	}
}

class Proxy implements Network { // 代理上网
	private Network network;

	public Proxy(Network network) {// 设置代理的真实操作
		this.network = network; // 设置代理的子类
	}

	public void check() { // 身份验证操作
		System.out.println("检查用户是否合法!");
	}

	public void browse() {
		this.check(); // 调用具体的代理业务操作
		this.network.browse(); // 调用真实的上网操作
	}
}

public class ProxyDemo {
	public static void main(String args[]) {
		Network net = null; // 定义接口对象
		net = new Proxy(new Real()); // 实例化代理,同时传入代理的真实操作
		net.browse(); // 调用代理的上网操作
	}
}

4.观察者设计模式

       所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。

       java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。

       示例代码如下:

Java代码 复制代码 收藏代码
  1. import java.util.Observable;  
  2. import java.util.Observer;  
  3.  
  4. class House extends Observable {  
  5.     private float price;  
  6.  
  7.     public void setPrice(float price) {  
  8.         this.setChanged();// 设置变化点 
  9.         this.notifyObservers(price);// 通知所有观察者价格改变 
  10.         this.price = price;  
  11.     }  
  12.  
  13.     public float getPrice() {  
  14.         return this.price;  
  15.     }  
  16.  
  17.     public House(float price) {  
  18.         this.price = price;  
  19.     }  
  20.  
  21.     public String toString() {  
  22.         return "房子价格为: " + this.price;  
  23.     }  
  24. }  
  25.  
  26. class HousePriceObserver implements Observer {  
  27.     private String name;  
  28.  
  29.     public HousePriceObserver(String name) {  
  30.         super();  
  31.         this.name = name;  
  32.     }  
  33.  
  34.     @Override 
  35.     public void update(Observable o, Object arg) {// 只要改变了 observable 对象就调用此方法 
  36.         if (arg instanceof Float) {  
  37.             System.out.println(this.name + "观察的价格更改为:" 
  38.                     + ((Float) arg).floatValue());  
  39.         }  
  40.  
  41.     }  
  42.  
  43. }  
  44.  
  45. public class ObserDeom {  
  46.     public static void main(String[] args) {  
  47.         House h = new House(1000000);  
  48.         HousePriceObserver hpo1 = new HousePriceObserver("购房者A");  
  49.         HousePriceObserver hpo2 = new HousePriceObserver("购房者B");  
  50.         HousePriceObserver hpo3 = new HousePriceObserver("购房者C");  
  51.         h.addObserver(hpo1);// 给房子注册观察者  
  52.         h.addObserver(hpo2);// 给房子注册观察者  
  53.         h.addObserver(hpo3);// 给房子注册观察者  
  54.         System.out.println(h);// 输出房子价格  
  55.         // 修改房子价格,会触发update(Observable o, Object arg)方法通知购房者新的房价信息 
  56.         h.setPrice(2222222);//  
  57.         System.out.println(h);// 再次输出房子价格  
  58.     }  
  1. import java.util.Observable; 
  2. import java.util.Observer; 
  3.  
  4. class House extends Observable { 
  5.     private float price; 
  6.  
  7.     public void setPrice(float price) { 
  8.         this.setChanged();// 设置变化点 
  9.         this.notifyObservers(price);// 通知所有观察者价格改变 
  10.         this.price = price; 
  11.     } 
  12.  
  13.     public float getPrice() { 
  14.         return this.price; 
  15.     } 
  16.  
  17.     public House(float price) { 
  18.         this.price = price; 
  19.     } 
  20.  
  21.     public String toString() { 
  22.         return "房子价格为: " + this.price; 
  23.     } 
  24.  
  25. class HousePriceObserver implements Observer { 
  26.     private String name; 
  27.  
  28.     public HousePriceObserver(String name) { 
  29.         super(); 
  30.         this.name = name; 
  31.     } 
  32.  
  33.     @Override 
  34.     public void update(Observable o, Object arg) {// 只要改变了 observable 对象就调用此方法 
  35.         if (arg instanceof Float) { 
  36.             System.out.println(this.name + "观察的价格更改为:" 
  37.                     + ((Float) arg).floatValue()); 
  38.         } 
  39.  
  40.     } 
  41.  
  42.  
  43. public class ObserDeom { 
  44.     public static void main(String[] args) { 
  45.         House h = new House(1000000); 
  46.         HousePriceObserver hpo1 = new HousePriceObserver("购房者A"); 
  47.         HousePriceObserver hpo2 = new HousePriceObserver("购房者B"); 
  48.         HousePriceObserver hpo3 = new HousePriceObserver("购房者C"); 
  49.         h.addObserver(hpo1);// 给房子注册观察者 
  50.         h.addObserver(hpo2);// 给房子注册观察者 
  51.         h.addObserver(hpo3);// 给房子注册观察者 
  52.         System.out.println(h);// 输出房子价格 
  53.         // 修改房子价格,会触发update(Observable o, Object arg)方法通知购房者新的房价信息 
  54.         h.setPrice(2222222);//  
  55.         System.out.println(h);// 再次输出房子价格 
  56.     } 
posted @ 2015-03-16 16:19  周先森  阅读(632)  评论(0编辑  收藏  举报