設計模式三—抽象工廠模式

来源:http://www.cnblogs.com/Renyi-Fan/archive/2017/05/23/6892612.html
-Advertisement-
Play Games

設計模式三—抽象工廠模式 一、定義 抽象工廠模式是工廠方法模式的進一步抽象。如果產品簇中只有一種產品,則退化為工廠方法模式。 二、原理圖 三、代碼實例 * 蘋果和土豆是園丁1的傑作 * 葡萄和西紅柿是園丁2的傑作 1、Fruit.java 2、Apple.java 3、Grape.java 4、Ve ...


設計模式三—抽象工廠模式

一、定義

抽象工廠模式是工廠方法模式的進一步抽象。如果產品簇中只有一種產品,則退化為工廠方法模式。

 

二、原理圖

 

 

三、代碼實例

* 蘋果和土豆是園丁1的傑作

* 葡萄和西紅柿是園丁2的傑作

1、Fruit.java

public interface Fruit {
	/*
	 * 生長
	 * 收穫
	 * 栽種
	 */
	public void grow();
	public void harvest();
	public void plant();
}

  

2、Apple.java

public class Apple implements Fruit {

    private int treeAge;
    
    public void grow() {
        System.out.println("蘋果正在生長,,,");
    }

    
    public void harvest() {
        System.out.println("收穫蘋果");
    }

    
    public void plant() {
        System.out.println("栽種蘋果");
    }


    public int getTreeAge() {
        return treeAge;
    }


    public void setTreeAge(int treeAge) {
        this.treeAge = treeAge;
    }
    
    

}

 

3、Grape.java

public class Grape implements Fruit {
    private boolean seedless;
    
    public void grow() {
        System.out.println("葡萄正在生長。。。");
    }

    public void harvest() {
        System.out.println("收穫葡萄。");
    }

    public void plant() {
        System.out.println("栽種葡萄。");
    }

    public boolean isSeedless() {
        return seedless;
    }

    public void setSeedless(boolean seedless) {
        this.seedless = seedless;
    }
    
    

}

 

4、Vegetable.java

public interface Vegetable {
    /*
     * 生長
     * 收穫
     * 栽種
     */
    public void grow();
    public void harvest();
    public void plant();
}

 

5、Potato.java

public class Potato implements Vegetable {

    public void grow() {
        System.out.println("土豆正在生長,,,");
    }

    
    public void harvest() {
        System.out.println("收穫土豆");
    }

    
    public void plant() {
        System.out.println("栽種土豆");
    }

}

 

6、Tomato.java

public class Tomato implements Vegetable {

    public void grow() {
        System.out.println("西紅柿正在生長,,,");
    }

    
    public void harvest() {
        System.out.println("收穫西紅柿");
    }

    
    public void plant() {
        System.out.println("栽種西紅柿");
    }

}

 

7、Gardener.java

public interface Gardener {
    /*
     * 水果園丁
     * 蔬菜園丁
     * 水果蔬菜各兩種
     * 建立水果工廠的方法
     */
    
    public Fruit factoryFruit();
    public Vegetable factoryVegetable();
    
    
}

 

8、ConcreteGardener1.java

public class ConcreteGardener11 implements Gardener {

    //等級為1的園丁生產的水果和蔬菜
    /*
     * 蘋果和土豆是園丁1的傑作,或者說是一等產品
     * 葡萄和西紅柿是園丁2的傑作,或者說是二等產品
     */
    public Fruit factoryFruit() {
        return new Apple();
    }

    public Vegetable factoryVegetable() {
        return new Potato();
    }

}

 

9、ConcreteGardener2.java

public class ConcreteGardener12 implements Gardener {

    //等級為2的園丁生產的水果和蔬菜
    /*
     * 蘋果和土豆是園丁1的傑作,或者說是一等產品
     * 葡萄和西紅柿是園丁2的傑作,或者說是二等產品
     */
    public Fruit factoryFruit() {
        return new Grape();
    }

    public Vegetable factoryVegetable() {
        return new Tomato();
    }

}

 

10、ClientDemo

public class ClientDemo {

    public static void main(String[] args) {
    
        /*
         * 蘋果和土豆是園丁1的傑作,或者說是一等產品
         * 葡萄和西紅柿是園丁2的傑作,或者說是二等產品
         */
        Gardener gardener1=new ConcreteGardener11();
        Gardener gardener2=new ConcreteGardener12();
        Fruit apple = gardener1.factoryFruit();
        Vegetable potato=gardener1.factoryVegetable();
        Fruit grape = gardener2.factoryFruit();
        Vegetable tomato=gardener2.factoryVegetable();
        
        apple.plant();
        apple.grow();
        apple.harvest();
        potato.plant();
        potato.grow();
        potato.harvest();
        grape.plant();
        grape.grow();
        grape.harvest();
        tomato.plant();
        tomato.grow();
        tomato.harvest();
        

    }

}

 

 

四、運行結果

栽種蘋果

蘋果正在生長,,,

收穫蘋果

栽種土豆

土豆正在生長,,,

收穫土豆

栽種葡萄。

葡萄正在生長。。。

收穫葡萄。

栽種西紅柿

西紅柿正在生長,,,

收穫西紅柿

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • querySet.distinct() 去重覆__exact 精確等於 like 'aaa' __iexact 精確等於 忽略大小寫 ilike 'aaa' __contains 包含 like '%aaa%' __icontains 包含 忽略大小寫 ilike '%aaa%',但是對於sqlit ...
  • Given a list, rotate the list to the right by k places, where k is non-negative. ...
  • 一:參考官方文檔 1. Elasticsearch 5.4.0英文手冊 https://www.elastic.co/guide/en/elasticsearch/reference/5.4/search-request-post-filter.html 2. 《Elasticsearch權威指南》 ...
  • 在這裡我們要說的拓撲排序是有前提的 我們在這裡說的拓撲排序是基於有向無環圖的!!!。 (⊙o⊙)…我所說的有向無環圖都知道是什麼東西吧。。 如果不知道,我們下麵先來來說說什麼是有向無環圖。 所謂有向無環圖,顧名思義是不存在環的有向圖(至於有向圖是什麼不知道的在前面我們有一個圖論講解上都有)。 點的入 ...
  • ★☆ 輸入文件:2015message.in 輸出文件:2015message.out 簡單對比 時間限制:1 s 記憶體限制:256 MB 【題目描述】 有n個同學(編號為1到n)正在玩一個信息傳遞的游戲。在游戲里每人都有一個固定的信息傳遞對象,其中,編號為i的同學的信息傳遞對象是編號為Ti同學。 ...
  • 今天繼續函數的講解: 目錄: 1.函數對象 2.函數嵌套 3.名稱空間和作用域 4.閉包 5.裝飾器 6.迭代器 7.生成器 8.內置函數 第一部分:函數對象 在python中,一切皆對象,想int,str,list,dict,tuple等等,所以函數也不例外,對象都具有屬性。作為對象,它可以賦值給 ...
  • 最近工作中要用到搜索引擎,由於目前用的搜索引擎是LeanCloud 提供的 ,不太好用,不支持範圍等搜索,而且每天還收費30元,請求次數也有限制。基於這些原因,我們只好在自己的伺服器上部署搜索引擎了。 經過一番調研結合我們自身的技術,選擇使用Elasticsearch,下麵介紹Elasticsear ...
  • xml即可擴展標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。從結構上,很像HTML超文本標記語言。但他們被設計的目的是不同的,超文本標記語言被設計用來顯示數據,其焦點是數據的外觀。它被設計用來傳輸和存儲數據,其焦點是數據的內容。那麼Python是如何處理 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...