用newInstance()與用new是區別的,區別在於建立對象的方式不同,前者是使用類加載機制,後者是建立一個新類,且newInstance()只能調用無參構造函數。java
最大的區別在於內存。
靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,
因此靜態方法能夠直接調用,實例方法要先成生實例,經過實例調用方法,靜態速度很快,可是多了會佔內存。
任何語言都是對內存和磁盤的操做,至因而否面向對象,只是軟件層的問題,底層都是同樣的,只是實現方法不一樣。
靜態內存是連續的,由於是在程序開始時就生成了,而實例申請的是離散的空間,因此固然沒有靜態方法快,
並且靜態內存是有限制的,太多了程序會啓動不了。設計模式
1.單例設計模式安全
所謂單例設計模式簡單說就是不管程序如何運行,採用單例設計模式的類(Singleton類)永遠只會有一個實例化對象產生。具體實現步驟以下:服務器
(1) 將採用單例設計模式的類的構造方法私有化(採用private修飾)。網絡
(2) 在其內部產生該類的實例化對象,並將其封裝成private static類型。ide
(3) 定義一個靜態方法返回該類的實例。函數
示例代碼以下:this
}spa
1、單例模式的介紹 Singleton是一種建立型模式,指某個類採用Singleton模式,則在這個類被建立後,只可能產生一個實例供外部訪問,而且提供一個全局的訪問點
2、單例模式的實現
實現的方式有以下四種: .net
- public class SingletonTest {
-
- private SingletonTest() {
- }
-
- private static final SingletonTest instance = new SingletonTest();
-
- public static SingletonTest getInstancei() {
- return instance;
- }
-
- }
- public class SingletonTest {
-
- private SingletonTest() {
- }
-
- private static final SingletonTest instance = new SingletonTest();
-
- public static SingletonTest getInstancei() {
- return instance;
- }
-
- }
2.工廠設計模式
簡單工廠模式是屬於建立型模式,又叫作靜態工廠方法(Static Factory Method)模式 。簡單工廠模式是由一個工廠對象決定建立出哪種產品類的實例。
3.代理設計模式
指由一個代理主題來操做真實主題,真實主題執行具體的業務操做,而代理主題負責其餘相關業務的處理。好比生活中的經過代理訪問網絡,客戶經過網絡代理鏈接網絡(具體業務),由代理服務器完成用戶權限和訪問限制等與上網相關的其餘操做(相關業務)。
示例代碼以下:
- interface 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();
- }
- }
- interface 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();
- }
- }
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接口輕鬆實現以上功能。固然此種模式的實現也不單單侷限於採用這兩個類。
示例代碼以下:
- import java.util.Observable;
- import java.util.Observer;
-
- class House extends Observable {
- private float price;
-
- public void setPrice(float price) {
- this.setChanged();
- this.notifyObservers(price);
- this.price = price;
- }
-
- public float getPrice() {
- return this.price;
- }
-
- public House(float price) {
- this.price = price;
- }
-
- public String toString() {
- return "房子價格爲: " + this.price;
- }
- }
-
- class HousePriceObserver implements Observer {
- private String name;
-
- public HousePriceObserver(String name) {
- super();
- this.name = name;
- }
-
- @Override
- public void update(Observable o, Object arg) {
- if (arg instanceof Float) {
- System.out.println(this.name + "觀察的價格更改成:"
- + ((Float) arg).floatValue());
- }
-
- }
-
- }
-
- public class ObserDeom {
- public static void main(String[] args) {
- House h = new House(1000000);
- HousePriceObserver hpo1 = new HousePriceObserver("購房者A");
- HousePriceObserver hpo2 = new HousePriceObserver("購房者B");
- HousePriceObserver hpo3 = new HousePriceObserver("購房者C");
- h.addObserver(hpo1);
- h.addObserver(hpo2);
- h.addObserver(hpo3);
- System.out.println(h);
-
- h.setPrice(2222222);
- System.out.println(h);
- }
- }
- import java.util.Observable;
- import java.util.Observer;
-
- class House extends Observable {
- private float price;
-
- public void setPrice(float price) {
- this.setChanged();
- this.notifyObservers(price);
- this.price = price;
- }
-
- public float getPrice() {
- return this.price;
- }
-
- public House(float price) {
- this.price = price;
- }
-
- public String toString() {
- return "房子價格爲: " + this.price;
- }
- }
-
- class HousePriceObserver implements Observer {
- private String name;
-
- public HousePriceObserver(String name) {
- super();
- this.name = name;
- }
-
- @Override
- public void update(Observable o, Object arg) {
- if (arg instanceof Float) {
- System.out.println(this.name + "觀察的價格更改成:"
- + ((Float) arg).floatValue());
- }
-
- }
-
- }
-
- public class ObserDeom {
- public static void main(String[] args) {
- House h = new House(1000000);
- HousePriceObserver hpo1 = new HousePriceObserver("購房者A");
- HousePriceObserver hpo2 = new HousePriceObserver("購房者B");
- HousePriceObserver hpo3 = new HousePriceObserver("購房者C");
- h.addObserver(hpo1);
- h.addObserver(hpo2);
- h.addObserver(hpo3);
- System.out.println(h);
-
- h.setPrice(2222222);
- System.out.println(h);
- }
- }