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

来源: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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...