Java抽象工廠模式

2020-12-14 kevin雜談

抽象工廠模式是一個超級工廠,用來創建其他工廠。 這個工廠也被稱為工廠的工廠。 這種類型的設計模式屬於創建模式,因為此模式提供了創建對象的最佳方法之一。

在抽象工廠模式中,接口負責創建相關對象的工廠,而不明確指定它們的類。 每個生成的工廠可以按照工廠模式提供對象。

實現實例

我們將創建一個Shape和Color接口並實現這些接口的具體類。在下一步中,將創建一個抽象工廠類AbstractFactory。在每個工廠類ShapeFactory和ColorFactory定義都是擴展自AbstractFactory。創建工廠創建者/生成器類 - FactoryProducer。

AbstractFactoryPatternDemo這是一個演示類,使用FactoryProducer來獲取AbstractFactory對象。 它會將信息(CIRCLE / RECTANGLE / SQUARE)傳遞給AbstractFactory以獲取所需的對象類型。 它還將信息(用於Color的 RED / GREEN / BLUE)傳遞給AbstractFactory以獲取所需的對象類型。

第1步

創建Shape的接口。

Shape.java

public interface Shape { void draw();}

第2步

創建實現相同接口的具體類。

Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System.out.println("Inside Rectangle::draw() method."); }}

Square.java

public class Square implements Shape { @Override public void draw() { System.out.println("Inside Square::draw() method."); }}

Circle.java

public class Circle implements Shape { @Override public void draw() { System.out.println("Inside Circle::draw() method."); }}

第3步

創建一個Colors接口,如下所示

Color.java

public interface Color { void fill();}

第4步

創建實現相同接口的具體類。

public class Red implements Color { @Override public void fill() { System.out.println("Inside Red::fill() method."); }}

Green.java

public class Green implements Color { @Override public void fill() { System.out.println("Inside Green::fill() method."); }}

Blue.java

public class Blue implements Color { @Override public void fill() { System.out.println("Inside Blue::fill() method."); }}

第5步

創建實現相同接口的具體類。

AbstractFactory.java

public abstract class AbstractFactory { abstract Color getColor(String color); abstract Shape getShape(String shape) ;}

第6步

創建實現相同接口的具體類。

創建工廠類,根據給定信息擴展AbstractFactory以生成具體類的對象。

ShapeFactory.java

public class ShapeFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ if(shapeType == null){ return null; } 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; } @Override Color getColor(String color) { return null; }}

ColorFactory.java

public class ColorFactory extends AbstractFactory { @Override public Shape getShape(String shapeType){ return null; } @Override Color getColor(String color) { if(color == null){ return null; } if(color.equalsIgnoreCase("RED")){ return new Red(); }else if(color.equalsIgnoreCase("GREEN")){ return new Green(); }else if(color.equalsIgnoreCase("BLUE")){ return new Blue(); } return null; }}

第7步

創建工廠生成器/生產器類,通過傳遞如Shape或Color等信息來獲取工廠

FactoryProducer.java

public class FactoryProducer { public static AbstractFactory getFactory(String choice){ if(choice.equalsIgnoreCase("SHAPE")){ return new ShapeFactory(); }else if(choice.equalsIgnoreCase("COLOR")){ return new ColorFactory(); } return null; }}

第8步

使用FactoryProducer來獲取AbstractFactory,以便通過傳遞類型等信息來獲取具體類的工廠。

AbstractFactoryPatternDemo.java

public class AbstractFactoryPatternDemo { public static void main(String[] args) { //get shape factory AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE"); //get an object of Shape Circle Shape shape1 = shapeFactory.getShape("CIRCLE"); //call draw method of Shape Circle shape1.draw(); //get an object of Shape Rectangle Shape shape2 = shapeFactory.getShape("RECTANGLE"); //call draw method of Shape Rectangle shape2.draw(); //get an object of Shape Square Shape shape3 = shapeFactory.getShape("SQUARE"); //call draw method of Shape Square shape3.draw(); //get color factory AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR"); //get an object of Color Red Color color1 = colorFactory.getColor("RED"); //call fill method of Red color1.fill(); //get an object of Color Green Color color2 = colorFactory.getColor("Green"); //call fill method of Green color2.fill(); //get an object of Color Blue Color color3 = colorFactory.getColor("BLUE"); //call fill method of Color Blue color3.fill(); }}

第9步

驗證輸出,結果如下 -

Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.Inside Red::fill() method.Inside Green::fill() method.Inside Blue::fill() method.

相關焦點

  • 設計模式之工廠模式-抽象工廠模式
    設計模式之工廠模式-抽象工廠模式抽象工廠模式:定義了一個接口用於創建相關或有依賴關係的對象簇,而無需明確指定具體類。我們來看看使用抽象工廠模式來實現的披薩項目。來源:凱哥Java(kaigejava)先來看看項目結構:說明:1:工廠接口2:兩個實現類3:訂單對象
  • 程式設計師:如何使用SpringBoot的策略模式、抽象工廠和反射
    設計模式java的設計模式大體上分為三大類:創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。結構型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
  • Java設計模式:三大類工廠方法模式
    2)工廠方法模式(Factory Method):又稱為多形性工廠。  3)抽象工廠模式(Abstract Factory):又稱為工具箱,產生產品族,但不利於產生新的產品。  這三種模式從上到下逐步抽象,並且更具一般性。
  • 漫畫:什麼是 「抽象工廠模式」?
    作者 | 小灰來源 | 程式設計師小灰(ID:chengxuyuanxiaohui)所謂「工廠模式」,是三種常見設計模式的統稱,它們分別是簡單工廠模式、工廠方法模式、抽象工廠模式。上一期的漫畫中,我們介紹了簡單工廠模式和工廠方法模式的特點和應用場景,沒看過的小夥伴可以看這篇文章:漫畫:設計模式之 「工廠模式」這一期,我們來介紹抽象工廠模式,以及Spring框架當中對工廠模式的應用。
  • Java開發之設計模式總結:工廠模式
    工廠模式屬於創建型設計模式,用工廠方法代替new操作,讓子類去決定實例化哪個類,工廠方法將一個類的實例化延遲到子類什麼是工廠模式定義一個創建對象的接口,由子類去決定實例化哪一個類,工廠模式,抽象工廠簡單工廠以遊戲為例子,涉及四個類:GameFactory(遊戲工廠類),Gameable(遊戲接口),ShootGame(射擊類遊戲),TowerDefenceGame(塔防類遊戲)比如遊戲工廠,工廠方法通過出入的參數生成生成不同產品類型的遊戲
  • Spring中常見的設計模式——工廠模式
    一、簡單工廠模式簡單工廠模式(Simple Factory Pattern)由一個工廠對象決定創建哪一種產品類的實例,簡單工廠模式適用於工廠類負責創建對象較少的情況,且客戶端只需要傳入工廠類的參數,對於如何創建對象不關心。
  • 深入理解Java的三種工廠模式
    一、簡單工廠模式簡單工廠的定義:提供一個創建對象實例的功能,而無須關心其具體實現。被創建實例的類型可以是接口、抽象類,也可以是具體的類實現汽車接口奔馳類寶馬類簡單工廠,既能生產寶馬又能生產奔馳但大家看一下測試類,當一個人想要去買一輛寶馬汽車的時候(假設沒有銷售商),那麼他就要去找寶馬工廠給他生產一輛,過幾天又想要買一輛奔馳汽車的時候,又得跑到奔馳工廠請人生產,這無疑就增加了用戶的操作複雜性。所以有沒有一種方便用戶操作的方法呢?這個時候抽象工廠模式就出現了。
  • Java抽象類與接口的區別
    在討論它們之間的不同點之前,我們先看看抽象類、接口各自的特性。抽象類抽象類是用來捕捉子類的通用特性的 。它不能被實例化,只能被用作子類的超類。抽象類是被用來創建繼承層級裡子類的模板。如果一個類實現了某個接口,那麼它就繼承了這個接口的抽象方法。這就像契約模式,如果實現了這個接口,那麼就必須確保使用這些方法。接口只是一種形式,接口自身不能做任何事情。
  • java面試題總結:java的接口類和抽象類的特點
    java的接口類和抽象類的特點java中抽象類的特點:
  • 大神詳解,這麼詳細的Java設計模式不收藏可惜了
    為什麼再看一遍設計模式,主要有幾個原因:***,很多優秀的源碼基本都使用了設計模式,明確設計模式能夠更好的看源碼。第二,很多中間件設計理念也是基於設計模式的,還有其他的語言,都有自己的設計優秀實踐。對於我來說,設計模式始於java,不止於java。第三,有了這種規範,可以更好的和他人溝通,言簡意賅。
  • java 23種設計模式及其在spring,tomcat,jdk中的應用
    設計模式分類一般地設計模式分為三類共23種:2.1. 創建型模式單例模式、抽象工廠模式、建造者模式、工廠模式、原型模式。2.2.工廠模式3.2.1. 概要工廠模式(Factory Pattern)定義一個用於創建對象的接口,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。3.2.2.
  • JavaSE基礎知識學習---抽象類和接口
    什麼叫抽象類在java中,因為繼承,使得類越來越具體化,類的設計使得父類越來越通用,在類的設計裡應該保證父類和子類能夠共享特徵,有時候就把父類設計的非常抽象,讓它沒有具體的實例。這樣的類就叫抽象類,例如人可以說話,但是不同的人可能說的話不一樣,所以讓說話的內容由子類自己決定。
  • 設計模式篇-工廠模式
    使用過Spring的童鞋知道Spring使用的簡單工廠模式,那我們一塊看了解下什麼是工廠模式吧,先看幾個問題工廠模式有什麼作用?簡單工廠模式、工廠方法模式和抽象工廠模式分別有什麼區別?三、實現工廠模式讓我們先來實現一個工廠模式,來體會一下怎麼用工廠模式生產產品吧1、首先創建一個產品的抽象類和兩個產品public abstract class Product
  • 領略設計模式——工廠模式
    2、工廠方法模式。3、抽象工廠模式。幾種工廠模式在創建對象的時候在創建對象實例的時候有些區別。但本質上都是相同的。2.1 靜態工廠模式靜態工廠模式也稱簡單工廠模式,它可以根據具體條件來創建對象並返回。這種形式的工廠模式適合構造方法簡單的對象(或簡單參數)。
  • JavaScript設計模式-工廠模式
    JavaScript中常見的設計模式工廠模式提供一個創建實例的功能,不需要關心具體的實現。被創建的實例的類型可以是接口,也可以是抽象類或者具體類。工廠方法把一個類的實現延遲到它的子類中把CarShop設計為抽象類,要麼使用Creator對象,要麼使用Creator創建對象。
  • Java面向對象之final、abstract抽象、和變量生命周期
    比如在模板方法設計模式中。在構造器中調用的方法(初始化方法),此時一般使用final修飾。這也是構造器不能被繼承的原因。注意: final修飾的方法了,子類可以調用,但是不能覆蓋(重寫)。抽象類可以不包含抽象方法,倘若包含,哪怕是一個,該類也必須作為抽象類,抽象類可以包含普通方法,可以給子類調用;抽象類是有構造器的,且其子類構造器必須先調用父類構造器。若子類沒有實現/覆蓋父類所有的抽象方法,那么子類也得作為抽象類(抽象派生類)。
  • 常用的Java設計模式
    這滿足創建型模式中所要求的「創建與使用相分離」的特點。工廠模式有 3 種不同的實現方式,分別是簡單工廠模式、工廠方法模式和抽象工廠模式。5.1、簡單工廠模式如果要創建的產品不多,只要一個工廠類就可以完成,這種模式叫「簡單工廠模式」。
  • 通俗易懂的告訴你「策略模式」在java多線程中的應用
    「策略模式」這種設計模式。下面我們就一起來看看「策略模式」是如何運用在javaduo線程中的。01什麼是「策略模式」廢話少說,先看定義!抽象策略類(Strategy):策略的抽象,出行方式的抽象具體策略類(ConcreteStrategy):具體的策略實現,每一種出行方式的具體實現。
  • 論Java中的抽象類與接口
    抽象——abstract,抽象類的方法不一定是抽象的,但抽象方法出現的類一定是抽象類。最重要的是:抽象類,抽象既不是真的,所以,抽象類不可以實例化。但可以通過抽象類的實例化來使用子類可以不是抽象類,但要實現抽象父類中的所有抽象方法,否則必須定義為abstract類型。
  • 從零開始學設計模式(一)——設計模式介紹及工廠模式
    這使得程序在判斷針對某個給定實例需要創哪些對象時更加靈活工廠模式(Factory Pattern)抽象工廠模式(Abstract Factory Pattern)單例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern)2結構型模式這些設計模式關注類和對象的組合