1. 程式人生 > >java中工廠模式和單例模式詳解

java中工廠模式和單例模式詳解

如何將例項化具體類的程式碼從應用中抽離或者封裝起來,使它們不會干擾應用的其他部分?

1:簡單工廠模式:其作用是例項化物件而不需要客戶瞭解這個物件屬於那個具體的子類。 using System; using System.Collections; public class MyClass {     public static voidMain()     {        //通過引數來例項化子類。        IVehicle vehicle =FactoryVehicle.CreateVehicle("car");        vehicle.go();        Console.ReadLine();        } } public class FactoryVehicle {     public static IVehicleCreateVehicle(string VehicleName)     {        switch(VehicleName.ToLower())        {            case"car":            return newCar();            case"boat":            return newBoat();           default:            return newCar();        }     } } public interface IVehicle {     void go(); } public class Car:IVehicle {     public void go()     {        Console.WriteLine("car");     } } public class Boat:IVehicle {     public void go()     {        Console.WriteLine("boat");     } } 2:抽象工廠:即將工廠方法也抽象出來,由具體的子類來例項化工廠。產品建立部分和簡單工廠模式相同。 using System; using System.Collections; public class MyClass {     public static voidMain()     {        //通過定義的工廠來例項化。弊端是當產品很多時需要增加很多的工廠。程式碼重複。        FactoryVehicle factory = new FactoryCar();        IVehicle vehicle =factory.CreateVehicle();        vehicle.go();        Console.ReadLine();        } } public interface FactoryVehicle {     IVehicle CreateVehicle(); } public class FactoryCar:FactoryVehicle {     public IVehicleCreateVehicle()     {        return new Car();     } } public class FactoryBoat:FactoryVehicle {     public IVehicleCreateVehicle()     {        return new Boat();     } } public interface IVehicle {     void go(); } public class Car:IVehicle {     public void go()     {        Console.WriteLine("car");     } } public class Boat:IVehicle {     public void go()     {        Console.WriteLine("boat");     } }3:反射工廠模式: 其實就是通過反射的方式來獲得具體例項化是那個類。 using System; using System.Collections; using System.Reflection; public class MyClass {     public static voidMain()     {        //使用反射的方法獲得例項化的類        IVehicle vechicle =ReflectFactory.CreateVehicleByReflect("Car");        vechicle.go();        Console.ReadLine();        } } public class ReflectFactory {     public static IVehicleCreateVehicleByReflect(string typeName)     {        Type type = Type.GetType(typeName);        ConstructorInfo  ci =type.GetConstructor(System.Type.EmptyTypes);;        return (IVehicle)ci.Invoke(null);     } } public class FactoryBoat:FactoryVehicle {     public IVehicleCreateVehicle()     {        return new Boat();     } } public class FactoryCar:FactoryVehicle {     public IVehicleCreateVehicle()     {        return new Car();     } } public interface FactoryVehicle {     IVehicleCreateVehicle(); } public interface IVehicle {     void go(); } public class Car:IVehicle {     public void go()     {        Console.WriteLine("car");     } } public class Boat:IVehicle {     public void go()     {        Console.WriteLine("boat");     } }

概念:

  java中單例模式是一種常見的設計模式,單例模式分三種:懶漢式單例、餓漢式單例、登記式單例三種。單例模式有一下特點:1、單例類只能有一個例項。  2、單例類必須自己自己建立自己的唯一例項。  3、單例類必須給所有其他物件提供這一例項。單例模式確保某個類只有一個例項,而且自行例項化並向整個系統提供這個例項。在計算機系統中,執行緒池、快取、日誌物件、對話方塊、印表機、顯示卡的驅動程式物件常被設計成單例。這些應用都或多或少具有資源管理器的功能。每臺計算機可以有若干個印表機,但只能有一個Printer Spooler,以避免兩個列印作業同時輸出到印表機中。每臺計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免一個通訊埠同時被兩個請求同時呼叫。總之,選擇單例模式就是為了避免不一致狀態,避免政出多頭。

單利模式: package singleton;   02     03   13   16 class LockSingleton{   17     private volatilestatic LockSingleton singleton;   18     privateLockSingleton(){}   19        20    //詳見:http://www.ibm.com/developerworks/cn/java/j-dcl.html  21     public staticLockSingleton getInstance(){   22        if(singleton==null){   23           synchronized(LockSingleton.class){   24               if(singleton==null){  25                  singleton=new LockSingleton();  26               }   27            }  28        }   29        return singleton;   30     }  31        32 }   33   36 enum EnumSingleton{   37     INSTANCE;  38     public voiddoSomeThing(){   39     }  40 }   41   44 class InternalSingleton{   45     private static classSingletonHolder{   46        private final static InternalSingleton INSTANCE=newInternalSingleton();   47     }     48     privateInternalSingleton(){}   49     public staticInternalSingleton getInstance(){   50        return SingletonHolder.INSTANCE;  51     }  52 }   53   56 class HungrySingleton{   57     private staticHungrySingleton singleton=new HungrySingleton();  58     privateHungrySingleton(){}   59     public staticHungrySingleton getInstance(){   60        return singleton;   61     }  62 }   63   66 class LazySingleton{   67     private staticLazySingleton singleton;   68     privateLazySingleton(){   69     }  70     public staticLazySingleton getInstance(){   71        if(singleton==null){   72           singleton=new LazySingleton();   73        }   74        return singleton;   75     }     76 } 

相關推薦

Java常見的設計模式---簡單工廠模式工廠方法模式模式

在講設計模式之前,我們首先來說一下面向物件思想的設計原則,在實際的開發中,我們要想更深入的瞭解面向物件思想,就必須熟悉前人總結過的面向物件的思想的設計原則:1.單一職責原則:“高內聚,低耦合”,也就是說,每個類應該只有一個職責,對外只能提供一種功能,而引起類變化的原因應該只有

java工廠模式模式

如何將例項化具體類的程式碼從應用中抽離或者封裝起來,使它們不會干擾應用的其他部分? 1:簡單工廠模式:其作用是例項化物件而不需要客戶瞭解這個物件屬於那個具體的子類。 using System; using System.Collections; public class MyClass {  

JAVA工廠模式模式講解

轉載:http://blog.csdn.net/fangleijiang/article/details/19912667 1.單例模式 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個例項而且該例

java設計模式---淺談2種工廠模式模式

1、 工廠模式  。比如有一個統一介面  A   ,這個A介面是一個標準  。如果有類  B  和 C   那麼 BC必須實現A介面  。 我們在以往的 方法生成這種物件的時候   A  b=new  B() ;  A c=new C() ;這樣的方式來的 .但是如果不同的

快速理解Java的五種模式

嵌套類 ati class 由於 aop 適合 singleton 重復 code 解法一:只適合單線程環境(不好) package test; /** * @author xiaoping * */ public class Singleton { pri

scala 基礎十二 scala apply的使用,工廠方法模式的實現

定義 其他 返回 pack 新的 true 伴生對象 args null 1. apply 可以用來實現類似於靜態的初始化類的實例,請看下面實例 package smart.iot class applyclass { } class A {

Java基礎-static關鍵字模式

static關鍵字 static關鍵字的特點 用來修飾類的成員-修飾成員變數的稱之為類變數(靜態變數),修飾成員方法的稱之為類方法(靜態方法)。(屬性拿static修飾完之後就不叫屬性了,他也就不屬於任何物件了,而是屬於多個物件共享的,就叫類變數或靜態變數,方法也一樣)

常見的設計模式工廠模式模式

工廠模式 工廠方法模式有兩個抽象類,一個是產品抽象類,一個是工廠抽象類,若干個具體產品類和對應的具體工廠類,具體產品抽象類與產品抽象類是實現關係,與具體工廠類是依賴關係,具體工廠類與抽象工廠類是實現關係。 客戶端程式碼如下 工廠模式是定義一個用於建立物件的介面,讓子類決定將哪一個

Python的工廠模式模式

工廠模式: 解耦 定義類或方法,讓其功能越單一越好 #!/usr/bin/python #coding:utf-8 class Cake(): def __init__(self,weidao=

關於工廠模式模式的融合用法的個人見解

最近在思考spring程式碼如何降低記憶體消耗,減少物件建立的問題。後來想到使用工廠模式+單例模式來實現。此處就不貼程式碼了。直接介紹原理: 1,提供一個工廠類Factory,來提供一個統一的入口,讓APP統一從入口呼叫,獲取想要的類的物件。 2,為使用者提供的類的物件,

C++工廠模式的結合使用

單例模式: 簡單來說一個類只有一個例項且封裝性好。這裡用巨集定義實現。 animal_singleton.h #pragma once #include <iostream> #define IMPLEMENTION_SINGLETON_CL

常用設計者模式---工廠模式模式

從今天起(2017.2.14),我要開始系統認真的啃基礎,堅持下去,每天進步一點點。 一、什麼是設計者模式(what)? 最早提出“設計模式”概念的是建築設計大師亞力山大Alexander。在他的《建築的永恆之道》裡這樣描述:模式是一條由三個部分組成的通用規則:它表示了一個

java最嚴謹的模式的實現方式

現在很多有關java的書籍、視訊、部落格等有講解java中的單例模式的實現,但是遺憾的是,很多講的都不是完全嚴謹的。 java中一個嚴謹的單例模式應該包含以下幾個方面: 1.有一個private型別靜態例項,從而防止從外部直接訪問; 2.建構函式必須是private的,防止

JAVA設計模式模式-快速理解Java的五種模式(轉)

百度百科對單例模式的介紹 顯然單例模式的要點有三個;一是某個類只能有一個例項;二是它必須自行建立這個例項;三是它必須自行向整個系統提供這個例項。 從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的建構函式,二是類定義中含有一個該類的靜態私有物件,三是該

自己對設計模式的理解:工廠模式模式

一、工廠模式:個人總結class  Factory {static function createObject($par){if ($par == 1) {$test1 = new Object1();} elseif ($par == 2) {$test2 = new O

Java的10個模式訪問問題

什麼是Singleton類?你之前用過Singleton嗎?Singleton是一個類,在整個應用程式中只有一個例項,並提供一個getInstance()方法來訪問單例例項。在JDK中有許多類是使用Singleton模式實現的,如java.lang.Runtime,它提供了getRuntime()方法來訪問它

設計模式與XML(二)建造者模式模式(C++)

一、實驗目的及要求 1、掌握建立型模式的概念。 2、掌握工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式的構造方式及使用情景。 二、實驗裝置(環境) 1、   軟體需求: Dev-Cpp5.4, Rational Rose / Microsoft Visio

享元模式模式的區別

享元模式可以理解成一組共享的物件集合 享元模式 Class flyWeight { Object get(std::string key) { if(m_m

JAVA堆棧內存分配(摘抄)

如果 public china weight 所有 有道 動態 面試題 class 在Java中,有六個不同的地方可以存儲數據: 1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制. 2. 棧:存放基本類型的變量數據和對象的引用,但對象本身不存放在棧

Java的transientsynchronized的使用

transient和synchronized這兩個關鍵字沒什麼聯絡,這兩天用到了它們,所以總結一下,兩個關鍵字做個伴! transient java語言的關鍵字,變數修飾符,如果用transient宣告一個例項變數,當物件儲存時,它的值不需要維持。換句話來說就是,用transient關鍵字標