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

工廠模式:靜態工廠模式、工廠方法模式、抽象工廠模式

一、簡單工廠模式(靜態工廠模式)

1、簡單說明工廠模式:現在所謂的個性化定製就是一個很好的列子,比如你想買一輛與眾不同的汽車, 你就去汽車生產廠家說你要什麼樣的汽車,之後他就會按你的要求給你生產你的車,而你無需關心這個生產過程,這就是工廠模式;

2、簡單工廠模式中只有三個角色:工廠,產品抽象,具體產品類;具體產品實現抽象產品,工廠按照傳入的產品類名稱生產具體例項;工廠中使用java反射進行動態生產物件

3、簡單工廠模式中如果不使用java的反射動態生產物件,則你如果要生產另一種汽車,就要修改工廠,而如果使用java的反射動態生成,則你只需要新增具體產品類就可以而不用在修改工廠。

4、簡單工廠模式適合於生產產品比較少的 。  

二、工廠方法模式

1、這種模式相比簡單工廠模式角色有所改變:抽象工廠角色,具體工廠角色,抽象產品角色, 具體產品角色,其中的抽象工廠角色中定義了一個抽象方法,該方法就是一個獲取具體產品的抽象方法,當具體工廠實現抽象工廠的時候也就實現了這個獲取具體產品的方法,個人感覺如果簡單工廠模式使用java反射的話和工廠方法模式在本質上沒什麼區別,要說有區別就是在簡單工廠模式中所有的產品都在工廠中生產,比如蘋果,香蕉都由工廠角色生產,而在工廠方法模式中具體的產品由具體的工廠生產,比如蘋果由蘋果公司生產,香蕉由香蕉公司生產。

三、抽象工廠模式

1、抽象工廠模式是對工廠方法模式的再次擴充套件這裡涉及到的角色有:抽象工廠角色 ,具體工廠角色,產品抽象角色(介面),產品抽象角色(抽象類),產品具體類, 這裡的產品想比上面多了一層是因為這裡涉及到了一個叫產品族的概念;

2、抽象工廠中定義了一個獲取具體產品的抽象方法, 而具體工廠實現這個方法獲取具體的產品;

3、產品抽象,就是一類產品的抽象, 而多餘的這個抽象類就是實現這個介面,在使用具體類來描述具體的產品資訊,就是這裡多的這個抽象類實現了產品 族 !!

具體程式碼如下:

一、簡單工廠(靜態工廠):

/**
 *
 */
package com.reflect;

/**
 *@author WHD
 *2014-10-14
 */
public class StaticFactory {
public static void main(String []args) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
    Apple apple= (Apple) ProductFactory.getProduce("com.reflect.Apple");
    Banana  banana=(Banana)ProductFactory.getProduce("com.reflect.Baner");
    apple.say();
    banana.say();
    
}
}

 class ProductFactory{
     public static Fruit getProduce(String name) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
         Fruit  f= (Fruit)Class.forName(name).newInstance();
         return f;
     }
 }
 
 interface Fruit{
     void say();
 }
 
 class Apple implements Fruit{
    @Override
    public void say() {
        System.out.println("i am  apple");
    }
    
 }
 
 class Banana implements Fruit{

    
    @Override
    public void say() {

   System.out.println("iam  Banana");
        
    }
    
 }

二、工廠方法模式:

/**
 *
 */
package com.reflect;

/**
 *@author WHD
 *2014-10-14
 */
public class MethodFactory {
public static void main(String []args){
    AppleFactory  appleFactory= new AppleFactory();
    BananaFactory  bananaFactory= new BananaFactory();
    Apples apple= appleFactory.getFruit();
    Banana1  banana=bananaFactory.getFruit();
    apple.say();
    banana.say();
    
}
}


interface Fruits{
    void say();
}

class Apples  implements Fruits{

    /* (non-Javadoc)
     * @see com.reflect.Fruits#say()
     */
    @Override
    public void say() {
        // TODO Auto-generated method stub
        System.out.println("apple");
        
    }
    
}

class Banana1  implements Fruits{

    /* (non-Javadoc)
     * @see com.reflect.Fruits#say()
     */
    @Override
    public void say() {
        // TODO Auto-generated method stub
        System.out.println("banan");
    }
    
}
interface FruitFactory{
    public Fruits getFruit();
    
}



class AppleFactory implements FruitFactory{

    
    @Override
    public Apples getFruit() {
        // TODO Auto-generated method stub
        return new Apples();
        
    }
    
}

class BananaFactory  implements FruitFactory{

    
    @Override
    public Banana1 getFruit() {
        // TODO Auto-generated method stub
        return new Banana1();
    }
    
}

三、抽象工廠模式:

/**
 *
 */
package com.reflect;

/**
 *@author WHD
 *2014-10-14
 */
public class InteFactory {
public static void  main(String []args){
    
    NorthFruitFac  nff= new NorthFruitFac();
    NorthApple  napp=(NorthApple)nff.getApple();
    NorthBanana  nban=(NorthBanana)nff.getBanana();
    napp.get();
    nban.get();
}
}

interface Fruit3{
    public void get();
}

 abstract class AppleFruit  implements Fruit3{
    @Override
     public abstract void get();
}
 
 abstract class BananaFruit implements Fruit3{
     @Override
     public abstract void get();
 }
 
 class SourApple extends AppleFruit{
    @Override
    public void get() {
        // TODO Auto-generated method stub
        System.out.println("南方蘋果");
    }
    
 }
 
 class  NorthApple extends AppleFruit{
    @Override
    public void get() {
        // TODO Auto-generated method stub
        System.out.println("北方蘋果");
    }
    
 }
 
 class SourBanana  extends BananaFruit{

    @Override
    public void get() {
        // TODO Auto-generated method stub
        System.out.println("南方句子");
    }
    
 }
 class NorthBanana extends  BananaFruit{

    @Override
    public void get() {
        // TODO Auto-generated method stub
    System.out.println("北方句子");    
    }
    
 }
 
 interface  Factory {
     AppleFruit  getApple();
     BananaFruit  getBanana();
 }
 
  class NorthFruitFac  implements Factory {

    @Override
    public AppleFruit getApple() {
        // TODO Auto-generated method stub
        return  new NorthApple();
    }

    
    @Override
    public BananaFruit getBanana() {
        // TODO Auto-generated method stub
        return  new NorthBanana();
    }
    
 }

相關推薦

工廠模式靜態工廠模式工廠方法模式抽象工廠模式

一、簡單工廠模式(靜態工廠模式) 1、簡單說明工廠模式:現在所謂的個性化定製就是一個很好的列子,比如你想買一輛與眾不同的汽車, 你就去汽車生產廠家說你要什麼樣的汽車,之後他就會按你的要求給你生產你的車,而你無需關心這個生產過程,這就是工廠模式; 2、簡單工廠模式中只有三個

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

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

帶你用例項學習代理模式靜態代理動態代理(JDKCGlib)以及區別和優缺點

Spring AOP的核心技術就是動態代理,所以小編學習並整理了代理模式的材料,供大家一起學習。 1、代理模式滿足的三個必要條件: 兩個角色:執行者、被代理物件 這個過程必須要做,但是自己不能做或者不想做,交給專業的人(媒婆) 執行者必須拿到被代理物件的引用(需要知道你要什

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

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

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

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

【設計模式】代理模式靜態代理,動態代理,spring aop

spring 實現接口 找到 master 代碼 -s result java 統一 代理模式分為靜態代理和動態代理。我們拿鏈家來舉例子,我們本人是真實的對象,有真實的業務需求:需要去找房子;鏈家是中介,是代理類,他來幫我執行找房子的這個操作。 靜態代理:   1.實現一個

java的三種代理模式靜態代理,動態代理,cglib代理

原文:https://segmentfault.com/a/1190000011291179 一、代理模式介紹 代理模式是一種設計模式,提供了對目標物件額外的訪問方式,即通過代理物件訪問目標物件,這樣可以在不修改原目標物件的前提下,提供額外的功能操作,擴充套件目標物件的功能。 簡言之,代

深入理解單例模式靜態內部類單例原理

這樣的 加載 hand 優點 傳遞 多個 喚醒 ref 一個   本文主要介紹java的單例模式,以及詳細剖析靜態內部類之所以能夠實現單例的原理。OK,廢話不多說,進入正文。    首先我們要先了解下單例的四大原則:    1.構造私有。    2.以靜態方法或者枚舉返回實

方法@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,只能訪問類變量,不能訪問實例變量

python靜態屬性@property方法@classmethod靜態方法@staticmethod和普通方法

靜態屬性:即將類的函式通過@property屬性封裝,封裝後例項呼叫該函式時,不再需要在函式後面加(),而是用類似呼叫資料屬性的方式直接呼叫函式名稱即可執行函式。 靜態屬性既可以訪問類的屬性,也可以訪問例項的屬性。 類方法:即在類的函式前加@classmethod屬性,函式第一個引數為cls類,表示該函式

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

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

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

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

String類StringBuilder類與StringBuffered類equals方法與== 常量池

======================================================================= *String型別:(底層是字元陣列+對陣列的操作)   --特點:        (1)是不可變的字串型別,(不可變:物件的內容不

記憶體區域--程式計數器本地方法

文章目錄程式計數器本地方法棧Java堆 程式計數器 概念 程式計數器(Program Counter Register) 也稱作為PC暫存器 作用 標記當前執行緒執行的位元組碼位置 特點 執行緒私有

jquery利用attrprop方法獲取設定input的checked屬性

在jquery中應該使用prop方法來獲取和設定checked屬性,不應該使用attr,需要的朋友可以參考下。 1、prop方法獲取、設定checked屬性 <input type="checkbox" name="checkboxMain"

SQL 優化——一般步驟索引問題優化方法(ANALYZECHECKOPTIMIZE)常用 SQL 的優化

一、優化 SQL 語句的一般步驟 1 通過 show status 命令瞭解各種 SQL 的執行頻率   MySQL 客戶端連線成功後,通過【 show [session|global] status 】命令可以提供伺服器狀態資訊,也可以在作業系統上使用 mysqladm

HTTP請求行中包含哪些內容?A請求方法 B資源名稱 C版本號 D狀態程式碼

答案:ABC解析:Http請求是指從客戶端到伺服器端的請求訊息。該請求訊息包括,在訊息首行中,對資源的請求方法、資源的識別符號及使用的協議。HTTP請求資訊由3部分組成:l 請求方法URI協議/版本l 請求頭(Request Header)l 請求正文HTTP響應HTTP應

java-記憶體管理(程式計數器虛擬機器棧本地方法方法區)和常量池

java記憶體管理 1. 執行時資料區域 Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,建立以及銷燬時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則是依賴使用者執行緒的啟動和結

JVM執行時資料區域 —— 程式計數器Java虛擬機器棧本地方法Java堆方法執行時常量池

java虛擬機器執行時資料區域的概括圖如下所示: 下面將對執行時資料區進行講解 程式計數器 1、說明:程式計數器可以看做是當前執行緒所執行的位元組碼的行號指示器。其實通俗點講就是記錄class檔案執行到哪一行 2、注意的點: (1)因為CPU執