1. 程式人生 > >工廠模式:簡單工廠模式、工廠方法模式、抽象工廠模式

工廠模式:簡單工廠模式、工廠方法模式、抽象工廠模式

工廠模式適合凡是出現大量物件需要建立,而且這些物件擁有相同的介面,可以使用工廠模式進行建立。

簡單工廠模式
簡單工廠模式分為三種:普通工廠模式、多個方法工廠模式、靜態方法工廠模式

以傳送QQ訊息或者微信訊息為例來說明:
普通工廠模式

/**
 * 兩種共同的介面
 */
public interface Message {
    public void send();
}
//QQ訊息
public class QQMessage implements Message {
    @Override
    public void send() {
        System.out.println("傳送QQ訊息"
); } }
//微信訊息
public class WeiXinMessage implements Message {
    @Override
    public void send() {
        System.out.println("傳送微信訊息");
    }
}
//訊息傳送工廠類
public class MessageFactory {
    public Message sendMessage(String type){
        if("QQ".equals(type)){
            return new QQMessage();
        }
        else
if("WeiXin".equals(type)){ return new WeiXinMessage(); }else{ return null; } } }
//訊息傳送測試
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new MessageFactory();
        Message message=messageFactory.sendMessage("QQ"
); message.send(); } }

這裡寫圖片描述

多個方法工廠模式
在普通工廠中,如果傳遞的字串和工廠中預定的不一致,則不能正確的建立物件。
對工廠類改進如下:

//訊息傳送工廠類
public class MessageFactory {
   public Message sendQQ(){
        return new QQMessage();
    }
    public Message sendWeiXin(){
        return new WeiXinMessage();
    }
}
//訊息傳送測試
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new MessageFactory();
        Message message=messageFactory.sendWeiXin();
        message.send();
    }
}

這裡寫圖片描述

靜態方法工廠模式
在多個方法中,還需要建立一個工廠物件才可以呼叫其方法,可以吧工程類中的方法設定為靜態的。
對工廠類改進如下:

//訊息傳送工廠類
public class MessageFactory {
   public static Message sendQQ(){
        return new QQMessage();
    }
    public static Message sendWeiXin(){
        return new WeiXinMessage();
    }
}
//訊息傳送測試
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory.sendWeiXin().send();
    }
}

工廠方法模式(Factory Method)
對上面的簡單工廠模式進行分析易知:類的建立依賴於工廠類,也就是說,如果要擴充套件程式,需要修改工廠類,違背了閉包的原則。因此就用到工廠方法模式:建立一個工廠介面和建立多個工廠實現類,這樣一旦需要增加新的功能,就可以直接增加工廠類,而不用修改工廠介面原有的程式碼。

/**
 * 兩種訊息共同的介面
 */
public interface Message {
    public void send();
}
//QQ訊息
public class QQMessage implements Message {
    @Override
    public void send() {
        System.out.println("傳送QQ訊息");
    }
}
//微信訊息
public class WeiXinMessage implements Message {
    @Override
    public void send() {
        System.out.println("傳送微信訊息");
    }
}
//訊息傳送工廠介面
public interface MessageFactory {
   public Message sendMessage();
}
//傳送QQ訊息的工廠類
public class QQFactory implements MessageFactory {
    @Override
    public Message sendMessage() {
        return new QQMessage();
    }
}
//傳送微信訊息的工廠類
public class WeiXinFactory implements MessageFactory {
    @Override
    public Message sendMessage() {
        return new WeiXinMessage();
    }
}
//訊息傳送測試
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new QQFactory();
        Message message=messageFactory.sendMessage();
        message.send();
    }
}

這裡寫圖片描述

抽象工廠模式(Abstract Factory)
抽象工廠模式有四種角色:

  • 抽象工廠(Abstract Factory)角色:擔任這個角色的是工廠方法模式的核心
  • 具體工廠(Concrete Factory)角色:這個角色直接建立例項
  • 抽象產品(Abstract Product)角色:這個角色的類是工廠方法模式所建立的物件的父類,或它們共同擁有的介面。
  • 具體產品(Concrete Product)角色:這個角色是具體的產品

    下面還是以發訊息的例子來說明,假如可以傳送QQ和微信兩種訊息,並且QQ可以傳送語音訊息和視訊訊息,微信可以傳送文字訊息和視訊訊息,其中,在這四種訊息中,語音、文字屬於省流量的訊息,圖片和視訊屬於費流量的訊息。

第一:先建立兩種訊息介面

//QQ訊息介面
public interface QQMessage {
}
//微信訊息介面
public interface WeiXinMessage {
}

第二:(1)實現QQ下的兩種訊息傳送方式

//QQ訊息下的具體產品1:QQ語音訊息
public class SoundQQMessage implements QQMessage{
    public SoundQQMessage(){
        System.out.println("傳送QQ訊息:QQ語音訊息");
    }
}
//QQ訊息下的具體產品2:QQ視訊訊息
public class VideoQQMessage implements QQMessage {
    public VideoQQMessage(){
        System.out.println("傳送QQ訊息:QQ視訊訊息");
    }
}

(2)實現微信下的兩種訊息傳送方式

//微信訊息下的具體產品1:微信文字訊息
public class CharacterWeiXinMessage implements WeiXinMessage {
    public CharacterWeiXinMessage(){
        System.out.println("傳送微信訊息:微信文字訊息");
    }
}

//微信訊息下的具體產品2:微信圖片訊息
public class PhotoWeiXinMessage implements WeiXinMessage {
    public PhotoWeiXinMessage(){
        System.out.println("傳送微信訊息:微信圖片訊息");
    }
}

第三:傳送訊息的介面

//傳送訊息的工廠介面
public interface MessageFactory {
    public QQMessage sendQQMessage();
    public WeiXinMessage sendWeiXinMessage();
}

第四:實現具體的傳送訊息工廠

//具體的工廠類1:只負責傳送語音文字這樣省流量的資訊
public class Sound_Character_MessageFactory implements MessageFactory {
    @Override
    public QQMessage sendQQMessage() {
        return new SoundQQMessage();
    }
    @Override
    public WeiXinMessage sendWeiXinMessage() {
        return new CharacterWeiXinMessage();
    }
}
//具體的工廠類2:只負責傳送視訊圖片這樣費流量的資訊
public class Video_Photo_MessageFactory implements MessageFactory {

    @Override
    public QQMessage sendQQMessage() {
        return new VideoQQMessage();
    }

    @Override
    public WeiXinMessage sendWeiXinMessage() {
        return new PhotoWeiXinMessage();
    }
}

第五:傳送訊息測試

//傳送訊息測試
public class FactoryTest {
    public static void main(String[] args) {
        MessageFactory messageFactory1=null;
        System.out.println("工廠1:傳送省流量的訊息");
        messageFactory1=new Sound_Character_MessageFactory();
        messageFactory1.sendQQMessage();
        messageFactory1.sendWeiXinMessage();

        System.out.println(".................................");

        MessageFactory messageFactory2=null;
        System.out.println("工廠2:傳送費流量的訊息");
        messageFactory2=new Video_Photo_MessageFactory();
        messageFactory2.sendQQMessage();
        messageFactory2.sendWeiXinMessage();
    }
}

這裡寫圖片描述

工廠方法模式 和 抽象工廠模式 的 區別

  • 工廠方法模式只有一個抽象產品類,而抽象工廠模式有多個。
  • 工廠方法模式的具體工廠只能建立一個具體產品類的例項,而抽象工廠模式可以建立多個。
  • 工廠方法建立 “一種” 產品,抽象工廠需要建立一些列產品,說抽象工廠就像工廠,而工廠方法則像是工廠的一種產品生產線。

相關推薦

java三種工廠模式簡單工廠工廠方法抽象工廠

簡單工廠 簡單工廠模式又 叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。 我們從一個例項展開 現在有一道面試題:使用java實現一個計算機控制檯

工廠模式簡單工廠模式工廠方法模式抽象工廠模式

工廠模式適合凡是出現大量物件需要建立,而且這些物件擁有相同的介面,可以使用工廠模式進行建立。 簡單工廠模式 簡單工廠模式分為三種:普通工廠模式、多個方法工廠模式、靜態方法工廠模式 以傳送QQ訊息或者微信訊息為例來說明: 普通工廠模式 /** *

設計模式簡單工廠工廠方法抽象工廠之小結與區別

簡單工廠,工廠方法,抽象工廠都屬於設計模式中的建立型模式。其主要功能都是幫助我們把物件的例項化部分抽取了出來,優化了系統的架構,並且增強了系統的擴充套件性。 本文是本人對這三種模式學習後的一個小結以及對他們之間的區別的理解。 簡單工廠 簡單工廠模式的工廠類一般是使

C#設計模式之創建類模式簡單工廠模式

div main bst http fin 想要 對象 sqlserver 關鍵字 這是記錄設計模式種的創建型模式的第一篇,所以,在開頭要說一些關於創建型模式的含義和意義。 創建型模式 軟件系統在運行時,類將被實例化成對象,並由這些被創建的對象協作完成系統中要求的各項業務功

JAVA 工廠模式簡單工廠

int oba 創建型模式 face gen 工廠方法 getc 字符 auto 簡單工廠模式(SimpleFactory Pattern):   又稱為靜態工廠方法(Static Factory Method)模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同

設計模式(2)——建立型——工廠相關簡單工廠(Simple factory),工廠方法(Factory method),抽象工廠(Abstract factory)

概要 這裡試圖描述23個設計模式中的兩個工廠(Factory)相關的設計模式:工廠方法(Factorymethod),抽象工廠(Abstract factory)。 注意點: 這兩個都屬於建立型設計模式。 由於這兩個設計模式都

大話設計模式簡單工廠模式

    由於面向過程程式設計造成的程式碼膨脹問題越來越嚴重,使其維護的代價高,靈活性很低。為了使程式碼易維護、易擴充套件、易複用和靈活性好,所以我們在採用面向物件程式設計的時候,防止採用面向物件的語言實際上卻做著面向過程的事兒,更需要採用某種設計模式,核心就是使程式變得高內

設計模式簡單工廠與策略模式

簡單工廠,真的是特別簡單的一個設計模式。 工廠方法內定義需要用到的方法的父類, 根據傳遞的引數來決定例項化何種子類物件。 //演算法的父類,抽象出返回結果的介面 public interface

c++設計模式簡單工廠模式(Simple Factory Pattern)

 定義: 從設計模式的型別上來說,簡單工廠模式是屬於建立型模式,又叫做靜態工廠方法(StaticFactory Method)模式,但不屬於23種GOF設計模式之一。簡單工廠模式是由一個工廠物件決定創建出哪一種產品類的例項。簡單工廠模式是工廠模式家族中最簡單實用的模式,

設計模式簡單工廠模式

簡單工廠模式又叫做靜態工廠方法模式,不屬於23種設計模式中的一種。 簡單工廠模式是工廠模式家族中最簡單的一種。 簡單工廠模式具有以下優點: 讓外界可以從直接建立具體物件的尷尬局面解脫出來,僅僅負責“消費”物件就可以了 外界不必管這些物件究竟如何建立及組織

java設計模式精講 Debug 方式+記憶體分析 第6章 抽象工廠模式

抽象工廠模式 6-1 抽象工廠講解 6-2 抽象工廠coding 6-3 抽象工廠原始碼解析 6-1 抽象工廠講解 工廠方法模式針對的就是產品等級結構 而抽象方法模

《大話設計模式》Java程式碼示例(十一)之抽象工廠模式

抽象工廠模式(Abstract Factory):提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。 package abstractfactory; /** * 抽象工廠方法(Abstract Factory) * 使用者實體類 */ p

設計模式學習筆記(C++實現)(三)--抽象工廠模式

1.抽象工廠模式簡介 英文名稱 Abstract Factory 主要目的 該模式定義了一系列相關或者相互依賴物件的介面,而不用指定它們具體的類。 使用場景 1.一個系統需要獨立於它的產品的建立、組合和表示時; 2.一個系統要由多個產品系列中的一個來

我的設計模式簡單設計模式

單例模式 代理模式 策略模式 門面模式 適配器模式 1.例子模式單例模式 Singleton Patternonly one 原則問題:實例只有一個方案:only(私有化構造) one(提供一個入口) 方案的問題:入口的線程問題 多例模式 Multition Pattern有上限多例

Python之路(第三十一篇) 網路程式設計簡單的tcp套接字通訊粘包現象

  一、簡單的tcp套接字通訊 套接字通訊的一般流程 服務端 server = socket() #建立伺服器套接字 server.bind() #把地址繫結到套接字,網路地址加埠 server.listen() #監聽連結 inf_loop:

python 全棧開發str(字串)常用方法操作 for 有限迴圈以及if 迴圈

  str(字串)常用方法操作: 首字母大寫: s = 'mylovepython' s1 = s.capitalize() print(s1) 輸出: Mylovepython 單行多字串首字母大寫: s = 'my love python' s2 = s.title(

方法@classmethod屬性方法@property靜態方法 @staticmethod

baby turn 普通 用不了 stat 類變量 self. mon 小白 class Baby(): # def __init__(self,name):#構造函數不是必須得 # print(‘self的內存地址‘,id(self)) #

【面試必問】python實例方法方法@classmethod靜態方法@staticmethod和屬性方法@property區別

區別 實例 實例變量 對象 s參數 pro 當前 靜態方法 實例方法 【面試必問】python實例方法、類方法@classmethod、靜態方法@staticmethod和屬性方法@property區別 1、#類方法@classmethod,只能訪問類變量,不能訪問實例變量

Java記憶體區域(堆區虛擬機器棧本地方法程式計數器和方法區)和GC機制

目錄 Java垃圾回收概況 Java記憶體區域 Java物件的訪問方式 Java記憶體分配機制 Java GC機制 垃圾收集器 Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C

設計模式第2篇簡單工廠工廠方法抽象工廠設計模式

1.簡單工廠設計模式  特點:一個抽象的產品類、多個具體的產品類、一個具體的工廠類。  (1)抽象的產品類(例如產品為手機螢幕)     public interface Screen{       void screenSize();     }  (2)具體的產品類(例如需要5英寸和6英寸的手