【圖解設計模式系列】The Abstract Factory Pattern: 抽象工廠模式
定義:
抽象工廠模式提供了一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。
provides an interface for creating families of related or dependent objects without specifying their concrete classes.
Factory method create objects through inheritance. Abstract factory do it through object composition. Whenever you have families of related products you want to create, and you want to make sure your client create products that belong together, use Abstract Factory. When you want to decouple the client code from the concrete classes you ned to instantiate, or if you don’t know ahead of time all the concrete classes you are going to need, use Factory Method.
整潔一點 就是:
抽象工廠模式的主要角色如下:
抽象工廠(Abstract Factory):提供了建立產品的介面,它包含多個建立產品的方法 newProduct(),可以建立多個不同等級的產品。
具體工廠(Concrete Factory):主要是實現抽象工廠中的多個抽象方法,完成具體產品的建立。
抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。
具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它 同具體工廠之間是多對一的關係。
例項
Nike公司和lining公司都會生產運動品牌產品,包括服裝產品(夾克,T恤)和鞋類產品(跑鞋,籃球鞋)。
下面用程式碼來實現。
服裝類產品
/**
* 服裝產品
*/
public interface Clothes {
void printUsage();
}
/**
* 夾克
*/
public class JackClothes implements Clothes {
@Override
public void printUsage() {
System.out.println("我是夾克衫,穿我很潮");
}
}
/**
* T恤
*/
public class TShirtClothes implements Clothes {
@Override
public void printUsage() {
System.out.println("我是T恤,隨意");
}
}
鞋類產品
/**
* 鞋類產品
*/
public interface Shoe {
void describeSelf();
}
/**
* 跑鞋(具體的鞋類產品)
*/
public class RunningShoe implements Shoe {
@Override
public void describeSelf() {
System.out.println("我是跑鞋,我為自己帶鹽");
}
}
/**
* 籃球鞋(具體的鞋類產品)
*/
public class BasketballShoe implements Shoe {
@Override
public void describeSelf() {
System.out.println("我是籃球鞋,穿我打籃球吊到爆");
}
}
工廠
/**
* 抽象工廠
*/
public interface Factory {
/**
* 既生產鞋類產品
*/
Shoe produceShoe(BRAND brand);
/**
* 又能生產服裝類商品
*/
Clothes produceClothes(BRAND brand);
}
/**
* 李寧工廠,生產鞋系列產品,也生產服裝系列產品
*/
public class LiningFactory implements Factory {
/**
* 生產鞋系列產品
*/
@Override
public Shoe produceShoe(BRAND brand) {
if (BRAND.BASKETBALL_SHOE == brand) {
System.out.println("---李寧工廠生產籃球鞋---");
return new BasketballShoe();
}
if (BRAND.RUNNING_SHOE == brand) {
System.out.println("---李寧工廠生產跑鞋---");
return new RunningShoe();
}
return null;
}
/**
* 生產服裝系列產品
*/
@Override
public Clothes produceClothes(BRAND brand) {
if (BRAND.JACK_CLOTHES == brand) {
System.out.println("---李寧工廠生產夾克---");
return new JackClothes();
}
if (BRAND.TSHIRT_CLOTHES == brand) {
System.out.println("---李寧工廠生產T恤---");
return new TShirtClothes();
}
return null;
}
}
/**
* Nike工廠,生產鞋系列產品,也生產服裝系列產品
*/
public class NikeFactory implements Factory {
/**
* 生產鞋子系列產品
*/
@Override
public Shoe produceShoe(BRAND brand) {
if (BRAND.RUNNING_SHOE == brand) {
System.out.println("---Nike工廠生產籃球鞋---");
return new RunningShoe();
}
if (BRAND.BASKETBALL_SHOE == brand) {
System.out.println("---Nike工廠生產跑鞋---");
return new BasketballShoe();
}
return null;
}
/**
* 生產服裝系列產品
*/
@Override
public Clothes produceClothes(BRAND brand) {
if (BRAND.JACK_CLOTHES == brand) {
System.out.println("---Nike工廠生產夾克---");
return new JackClothes();
}
if (BRAND.TSHIRT_CLOTHES == brand) {
System.out.println("---Nike工廠生產T恤---");
return new TShirtClothes();
}
return null;
}
}
客戶端程式碼
public class Client {
public static void main(String[] args) {
// Nike工廠,生產鞋系列產品(籃球鞋,跑鞋)和服裝系列產品(夾克,T恤)
Factory nikeFactory = new NikeFactory();
// 生產鞋系列產品
Shoe nikeBasketballShoe = nikeFactory.produceShoe(BRAND.BASKETBALL_SHOE);// 籃球鞋
Shoe nikeRunningshoe = nikeFactory.produceShoe(BRAND.RUNNING_SHOE);// 跑鞋
nikeBasketballShoe.describeSelf();
nikeRunningshoe.describeSelf();
// 生產服裝系列產品
Clothes nikeJack = nikeFactory.produceClothes(BRAND.JACK_CLOTHES);// 夾克衫
Clothes nikeTshit = nikeFactory.produceClothes(BRAND.TSHIRT_CLOTHES);// T恤
nikeJack.printUsage();
nikeTshit.printUsage();
System.out.println("============================");
// 李寧工廠,生產鞋系列產品(籃球鞋,跑鞋)和服裝系列產品(夾克,T恤)
Factory liningFactory = new LiningFactory();
// 生產鞋系列產品
Shoe liningBasketballShoe = liningFactory.produceShoe(BRAND.BASKETBALL_SHOE);
Shoe liningRunningShoe = liningFactory.produceShoe(BRAND.RUNNING_SHOE);
liningBasketballShoe.describeSelf();
liningRunningShoe.describeSelf();
// 生產服裝系列產品
Clothes liningJack = liningFactory.produceClothes(BRAND.JACK_CLOTHES);
Clothes liningTshirt = liningFactory.produceClothes(BRAND.TSHIRT_CLOTHES);
liningJack.printUsage();
liningTshirt.printUsage();
}
}
相關文章
- 設計模式--抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式-抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式實戰 - 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式實戰 – 抽象工廠模式(Abstract Factory Pattern)設計模式抽象
- 設計模式系列之工廠模式三兄弟(Factory Pattern)設計模式
- Abstract Factory(抽象工廠)——物件建立型模式抽象物件模式
- 設計模式--工廠方法模式(Factory Method Pattern)設計模式
- 使用C# (.NET Core) 實現抽象工廠設計模式 (Abstract Pattern)C#抽象設計模式
- 設計模式系列之「抽象工廠模式」設計模式抽象
- 簡單工廠模式( Simple Factory Pattern )模式
- 設計模式 —— 抽象工廠模式設計模式抽象
- 設計模式-抽象工廠模式設計模式抽象
- 設計模式——抽象工廠模式設計模式抽象
- 《設計模式》 - 2. 工廠模式( Factory )設計模式
- java設計模式–抽象工廠模式Java設計模式抽象
- Java設計模式-抽象工廠模式Java設計模式抽象
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- [Design Pattern With Go]設計模式-工廠模式Go設計模式
- 設計模式 - 抽象工廠設計模式抽象
- 設計模式----抽象工廠設計模式抽象
- 設計模式 – 抽象工廠設計模式抽象
- 設計模式學習(二)工廠模式——抽象工廠模式設計模式抽象
- 【圖解設計模式系列】The Command Pattern: 命令列模式圖解設計模式命令列
- C# 設計模式(1)——簡單工廠模式、工廠模式、抽象工廠模式C#設計模式抽象
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- 建立型設計模式——抽象工廠模式設計模式抽象
- golang設計模式之抽象工廠模式Golang設計模式抽象
- 設計模式(三)抽象工廠方法模式設計模式抽象
- 23種設計模式(抽象工廠模式)設計模式抽象
- 使用C# (.NET Core) 實現簡單工廠(Simple Factory) 和工廠方法設計模式 (Factory Method Pattern)C#設計模式
- 設計模式:抽象工廠模式,結合類圖秒懂!設計模式抽象
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- Java常用設計模式之抽象工廠模式Java設計模式抽象
- 設計模式學習(六)-抽象工廠模式設計模式抽象
- JAVA設計模式 3【建立型】理解工廠模式與抽象工廠模式Java設計模式抽象
- Java設計模式學習筆記——工廠模式與抽象工廠模式Java設計模式筆記抽象
- 設計模式學習(二)工廠模式——抽象工廠模式+登錄檔設計模式抽象
- 設計模式——抽象工廠實驗設計模式抽象