• 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.     } 
  • 相关阅读:
    sql求两表的并集、交集、非交集、差集、结果集排序
    c# 为什么要使用Array、ArrayList、List?
    C# 实例化的执行顺序(转)
    正则捕获url的?号传值
    mvc5中重命名项目的名称后,出现"找到多个与名为“Home”的控制器匹配的类型"
    微信开发资料
    windows下建立netcore控制台程序,然后传送到centos7下的docker容器里运行
    error MSB3552: Resource file "**/*.resx" cannot be found. [/ConsoleApp1.csproj]
    c# 编译期常量const和运行时常量readonly
    c# 多线程之-- System.Threading Timer的使用
  • 原文地址:https://www.cnblogs.com/zhouxiansheng/p/4342120.html
Copyright © 2020-2023  润新知