1. 程式人生 > >設計模式心得1(工廠模式+單例模式+構建器模式+原型模式+介面卡模式)

設計模式心得1(工廠模式+單例模式+構建器模式+原型模式+介面卡模式)

設計模式分類

大致按照模式的應用目標分類,設計模式可以分為建立型模式、結構型模式和行為型模式。

  • 建立型模式,是對物件建立過程的各種問題和解決方案的總結,包括各種工廠模式(Factory、Abstract Factory)、單例模式(Singleton)、構建器模式(Builder)、原型模式(ProtoType)。

  • 結構型模式,是針對軟體設計結構的總結,關注於類、物件繼承、組合方式的實踐經驗。常見的結構型模式,包括橋接模式(Bridge)、介面卡模式(Adapter)、裝飾者模式(Decorator)、代理模式(Proxy)、組合模式(Composite)、外觀模式(Facade)、享元模式(Flyweight)等。

  • 行為型模式,是從類或物件之間互動、職責劃分等角度總結的模式。比較常見的行為型模式有策略模式(Strategy)、直譯器模式(Interpreter)、命令模式(Command)、觀察者模式(Observer)、迭代器模式(Iterator)、模板方法模式(Template Method)、訪問者模式(Visitor)。

Spring與設計模式

Spring中大量使用的以下兩種設計模式:工廠模式和單例模式。Spring容器最基本的介面就是BeanFactory。而ApplicationContext是BeanFactory的子介面,大部分javaEE用這個介面就夠了,也稱為Spring應用上下文。

工廠模式

工廠模式是我們最常用的例項化物件模式了,簡單講是用工廠方法代替new操作的一種模式。

工廠模式是根據呼叫資料返回某個類的一個例項,此類可以是多個類的某一個類。通常,這些類滿足共同的規則(介面)或父類。呼叫者只關心工廠生產的例項是否滿足某種規範,即實現的某個介面是否可供自己正常呼叫(呼叫者僅僅使用)。該模式給物件之間作出了清晰的角色劃分,降低程式的耦合。介面產生的全部例項通常用於實現相同介面,接口裡定義了全部例項共同擁有的方法,這些方法在不同的實現類中實現的方式不同。從而使程式呼叫者無須關心方法的具體實現,降低了系統異構的代價。

還記得Hibernate的HibernateSessionFactory,Spring的BeanFactory,以及對應的子類ApplicationContext,都是工廠模式

程式碼展示:

public class ShapeFactory {
   //使用 getShape 方法獲取形狀型別的物件
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }else if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}
public class FactoryPatternDemo {
   public static void main(String[] args) {
      ShapeFactory shapeFactory = new ShapeFactory();
      //獲取 Circle 的物件,並呼叫它的 draw 方法
      Shape shape1 = shapeFactory.getShape("CIRCLE");
      //呼叫 Circle 的 draw 方法
      shape1.draw();
      //獲取 Rectangle 的物件,並呼叫它的 draw 方法
      Shape shape2 = shapeFactory.getShape("RECTANGLE");
      //呼叫 Rectangle 的 draw 方法
      shape2.draw();
      //獲取 Square 的物件,並呼叫它的 draw 方法
      Shape shape3 = shapeFactory.getShape("SQUARE");
      //呼叫 Square 的 draw 方法
      shape3.draw();
   }
}

單例模式

單例模式限制了類例項的建立,但採用這種模式設計的類,可以保證僅有一個例項,並可提供訪問該例項的全域性訪問點。J2EE應用的大量元件,都需要保證一個類只有一個例項。比如資料庫引擎訪問點只能有一個。

更多的時候,為了提高效能,程式應儘量減少Java 物件的建立和銷燬時的開銷。使用單態模式可避免Java 類被多次例項化,讓相同類的全部例項共享同一記憶體區。

為了防止單態模式的類被多次例項化,應將類的構造器設成私有,這樣就保證了只能通過靜態方法獲得類例項。而該靜態方法則保證每次返回的例項都是同一個,這就需將該類的例項設定成類屬性,由於該屬性需要被靜態方法訪問,因此該屬性應設成靜態屬性。

//單態模式測試類  
public class SingletonTest {  
    //該類的一個普通屬性  
    private int value;  
    //使用靜態屬性儲存該類的一個例項  
    private static SingletonTest instance;  
    //構造器私有化,避免該類被多次例項化  
    private SingletonTest(){  
        System.out.println("正在執行構造器...");  
    }  
    //提供靜態方法返回該類例項   
    public static SingletonTest getInstance(){  
        //例項化類例項前,先檢查該例項是否存在  
        if(instance == null){  
            //如果不存在,則新建一個例項  
            instance = new SingletonTest();  
        }  
        //返回該類的成員變數:該類的例項   
        return instance;      
    }  
    //以下提供對普通屬性value的getter和setter方法  
    public int getValue(){  
        return value;  
    }  
    public void setValue(int values){  
        this.value = values;      
    }  
    //main方法
    public static void main(String args[]){  
        SingletonTest t1 = SingletonTest.getInstance();  
        SingletonTest t2 = SingletonTest.getInstance();  
        t2.setValue(9);  
        System.out.println(t1 == t2);  
    }  
}  

構建器模式

建立 HttpRequest 的過程,就是典型的構建器模式(Builder),通常會被實現成fluent 風格的 API,也有人叫它方法鏈。

HttpRequest request = HttpRequest.newBuilder(new URI(uri))
                     .header(headerAlice, valueAlice)
                     .headers(headerBob, value1Bob,
                      headerCarl, valueCarl,
                      headerBob, value2Bob)
                     .GET()
                     .build();

又如swagger-ui的配置,也是典型的構建器模式

private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("營養探索館-體檢系統")
                .description("powered by By-Health")
                .termsOfServiceUrl("http://www.by-health.com/")
                .contact(contact)
                .version("1.0")
                .build();
    }

原型模式

用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。

Prototype模式允許一個物件再建立另外一個可定製的物件,根本無需知道任何如何建立的細節,工作原理是:通過將一個原型物件傳給那個要發動建立的物件,這個要發動建立的物件通過請求原型物件拷貝它們自己來實施建立。

例如我們在new List和Map的時候,就是用的原型模式

Map<String,String> map=new HashMap<String,String>();

Map<String,String> map=new LinkedHashMap<String,String>();

List<String> list=new ArrayList<String>();

CoreBillInfo bill=new SaleOrderInfo();

介面卡模式

將一個類的介面轉換成客戶希望的另外一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
主要解決:主要解決在軟體系統中,常常要將一些”現存的物件”放到新的環境中,而新環境要求的介面是現物件不能滿足的。
何時使用:
1、系統需要使用現有的類,而此類的介面不符合系統的需要。
3、通過介面轉換,將一個類插入另一個類系中。(比如老虎和飛禽,現在多了一個飛虎,在不增加實體的需求下,增加一個介面卡,在裡面包容一個虎物件,實現飛的介面。)

public class Main
{

    public static void main(String[] args)
    {
        //我有一部256g公司年會中的iphoneX
        IphoneX iphone = new IphoneX();

        // 在中國,用兩孔插座充電
        TwoPinSoketChina twoPinSoketChina = new TwoPinSoketChina();
        //接上兩孔插座充電
        iphone.setTwoPinSoket(twoPinSoketChina);
        //充電
        iphone.charge();

        // 然後坐飛機去美國旅遊,美國某旅館的牆上有隻有一個三孔插座
        ThreePinSoketAmerica threePinSoketAmerica = new ThreePinSoketAmerica();
        // 幸好我有美國介面卡,一頭插到三孔插座,另一頭轉換成二孔插座,就可以給我的榮耀手機充電
        TwoPinAdapter twopinAdapter = new TwoPinAdapter(threePinSoketAmerica);

        // 在美國,通過美國介面卡,用三空插座充電
        iphone.setTwoPinSoket(twopinAdapter);
        //充電
        iphone.charge();

    }

}

相關推薦

設計模式心得1工廠模式+模式+構建模式+原型模式+介面卡模式

設計模式分類 大致按照模式的應用目標分類,設計模式可以分為建立型模式、結構型模式和行為型模式。 建立型模式,是對物件建立過程的各種問題和解決方案的總結,包括各種工廠模式(Factory、Abstract Factory)、單例模式(Singleton)、構

編程經常使用設計模式具體解釋--上篇工廠、建造者、原型

-a 裝飾器模式 nds support art 類的繼承 兩個 開放 lose 參考來自:http://zz563143188.iteye.com/blog/1847029 一、設計模式的分類 整體來說設計模式分為三大類: 創建型模式。共五種:工廠方法模式、抽

設計模式——建立型模式工廠,簡單工廠,建造者,原型

目錄 一、工廠模式 簡單工廠模式 工廠方法模式 二、抽象工廠模式 三、單例模式 四、建造者模式 五、原型模式 建

設計模式php示例 模式工廠模式

所謂的設計模式,就是具有多年開發經驗的人,在實際工作中為了解決某一種需求,而形成的一套程式碼方案。 1.單例模式: 單例模式:所謂的單例模式就是單一的例項。通過一個類永遠只能獲取一個物件。 基本的實現思路:單例模式要求類能夠有返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必

設計模式:簡單工廠工廠

判斷 include sse src div list .class name set 1 <?php 2 /** 3 * 純粹工廠類 4 */ 5 /*class Factory { 6 public static funct

設計模式學習1——簡單工廠模式

定義 簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式,但不屬於23種GOF設計模式之一,說它是一種程式設計習慣可能更恰當些。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專

大話設計模式1簡單工廠

用簡單工廠實現 控制檯跟窗體 簡易計 算器 程式碼如下  public class Operation { private double _numberA = 0; private double _numberB = 0;

Java—設計模式餓漢,懶漢和多設計模式

1.單例模式 定義:一個類只允許產生一個例項化物件。 a.物件如何產生? 通過類的構造方法 b.要想限制物件的產生? 通過構造方法限制,構造方法私有化,類外部無法產生例項化物件。 餓漢式單例:上來就new //餓漢式單例 class Singleton{

python小總結3異常、設計模式

一、異常 AttributeError:試圖訪問一個物件沒有的成員【屬性和方法】 ValueError:值錯誤,傳入了一個不期望的值 ImportError:無法匯入模組或者包:基本上路徑問題 IndexError:訪問了不在範圍內的索引 KeyError:試圖訪問字典中不存在的鍵 NameErr

【JAVA設計模式1.簡單工廠模式

簡單工廠模式是建立型設計模式: 建立型設計模式即封裝了具體生成物件的細節,僅暴露出生成物件的方法。只需向建立物件的方法提供引數,而不用自行實現判斷的邏輯。 UML圖(圖片來自網路): 簡單工廠模式提供了一個建立者類,暴露了一個工廠方法,用於根據接收的引數返回對應的具

C++重寫《大話設計模式》中模式例項二工廠模式

下面連結文章是我改寫的簡單工廠模式,可以和工廠模式做對比。 程式:輸入兩個數和運算子,得到 結果。 雖然工廠模式比簡單工廠模式編寫複雜一點,但是它更符合“開放-封閉原則”,就是程式增加功能應該是

設計模式之Factory工廠設計模式

工廠模式是我們很常用的模式了,著名的spring框架就使用了工廠模式。 為什麼說工廠模式是最常用的,因為工廠模式就相當於建立物件的new。工廠模式就是用來建立物件的 在PatternsInJava 書中把工廠模式主要分為:工廠方法與抽象工廠,當然這本書在舉例

java設計模式-每天三個設計模式工廠、建造者

    前情提要            在上篇文章中介紹了面向物件程式設計的七個基本原則,分別是單一職責,裡式替換、依賴注入、介面分離、迪米特原則、開閉原則、優先使用組合而不是繼承原則。    本文重點 工廠模式單例模式建造者模式    工廠模式,工廠模式又分為簡單工廠、工廠

設計模式 _第一招式_模式

一、定義 單例模式(Singleton Pattern)是一個比較簡單的模式,確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 二、程式碼演示 Singleton 類稱為單例類,通過使用private的建構函式確保在一個應用中只產生一個例項,並且自行例項化,單例

C++設計一個執行緒安全的懶漢模式

#incldue<iostream> #include<mutex> using namespace std; class CSingleton { public: static CSingleton* GetCSingleton() { if (_p ==

Java只打開一個視窗視窗的模式

防止重複建立視窗,可以使用單例模式。 我寫了個簡單的例子來測試。點選兩個不同的按鈕,分別開啟一個單例模式的視窗。 package com.singleton; import java.awt.event.ActionEvent; import java.awt.event.Action

java設計模式中的5種寫的方式

第一種(懶漢,執行緒不安全): Java程式碼   public class Singleton {      private static Singleton instance;      private Singleton (){}      public 

Android設計模式系列(3)--SDK原始碼之模式

單例模式,可以說是GOF的23種設計模式中最簡單的一個。這個模式相對於其他幾個模式比較獨立,它只負責控制自己的例項化數量單一(而不是考慮為使用者產生什麼樣的例項),很有意思,是一個感覺上很乾淨的模式,本人很喜歡這個模式。android中很多地方都用到了單例模式,本文以輸入法管理者InputMethodMan

模式作用特點及常見的模式分析6種模式分析

單例模式: 即在整個生命週期中,對於該物件的生產始終都是一個,不曾變化。 保證了一個類僅有一個例項,並提供一個訪問它的全域性訪問點。 作用: 在要求執行緒安全的情況下,保證了類例項的唯一性,執行緒安全。 在不需要多例項存在時,保證了類例項的單一性。不浪費記憶體。 特點: 公有的方法獲取例項, 私有的

學好Spark/Kafka必須要掌握的Scala技術點類、/伴生物件、繼承和trait,模式匹配、樣case class

3. 類、物件、繼承和trait 3.1 類 3.1.1 類的定義 Scala中,可以在類中定義類、以在函式中定義函式、可以在類中定義object;可以在函式中定義類,類成員的預設訪問級別是:public //在Scala中,類不用宣告為public //Scala原始檔中可以包含多個類,所有這些類都具有公