目录
-
-
-
-
- [1. 说明](#1. 说明)
- [2. 应用场景](#2. 应用场景)
- [3. 结构图](#3. 结构图)
- [4. 构成](#4. 构成)
- [5. 适用性](#5. 适用性)
- [6. 优点](#6. 优点)
- [7. 缺点](#7. 缺点)
- [8. java示例](#8. java示例)
-
-
-
1. 说明
- 1.提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
- 2.抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式。
- 3.抽象工厂模式用于系统的产品族,而不仅仅是一个等级结构;一个等级的抽象类只能创建一个等级的产品,而抽象工厂模式能创建多个等级的产品。
2. 应用场景
- 1.当一个系统不应当依赖于产品类实例如何被创建、组合和表示的细节时。
- 2.当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
- 3.属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
- 4.系统提供一个产品类的库,并希望系统的设计独立于这些产品的实现时。
3. 结构图
4. 构成
- 1.抽象工厂(Abstract Factory):声明一个创建产品对象的接口,但由子类决定要实例化的产品是哪一个。工厂方法通常返回该产品的抽象类型。
- 2.具体工厂(Concrete Factory):实现了抽象工厂接口的具体类,负责实例化产品对象。
- 3.抽象产品(Abstract Product):为每种产品声明接口,在抽象产品中定义了产品的抽象方法。
- 4.具体产品(Concrete Product):实现了抽象产品接口的具体类。
5. 适用性
- 1.一个系统要独立于它的产品的创建、组合和表示时。
- 2.一个系统要由多个产品系列中的一个来配置时。
- 3.当要强调一系列相关的产品对象的设计以便进行联合使用时。
- 4.当提供一个产品类库,只想显示它们的接口而不是实现时。
6. 优点
- 1.抽象工厂模式隔离了具体类的生成,使得客户不需要知道什么被创建。
- 2.增加一个新的产品族很方便,无需修改已有系统,符合开闭原则。
7. 缺点
- 1.增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对"开闭原则"的支持呈现倾斜性。
- 2.使用抽象工厂模式会增加系统中类的个数,在一定程度上增加了系统的复杂度和理解难度。
8. java示例
-
1.抽象产品 食物
package com.learning.factory.abstract_factory.example;
/**
- 抽象产品:食物
*/
public interface Food {
void prepare();
} - 抽象产品:食物
-
2.抽象产品 饮料
package com.learning.factory.abstract_factory.example;
/**
- 抽象产品:饮料
*/
public interface Drink {
void serve();
}
- 抽象产品:饮料
-
3.具体产品 中餐食物
package com.learning.factory.abstract_factory.example;
/**
- 具体产品:中餐食物
*/
public class ChineseFood implements Food {
@Override
public void prepare() {
System.out.println("准备中餐食物");
}
}
- 具体产品:中餐食物
-
4.具体产品 中餐饮料
package com.learning.factory.abstract_factory.example;
/**
- 具体产品:中餐饮料
*/
public class ChineseDrink implements Drink {
@Override
public void serve() {
System.out.println("供应中餐饮料");
}
} - 具体产品:中餐饮料
-
5.具体产品 西餐食物
package com.learning.factory.abstract_factory.example;
/**
- 具体产品:西餐食物
*/
public class WesternFood implements Food {
@Override
public void prepare() {
System.out.println("准备西餐食物");
}
}
- 具体产品:西餐食物
-
6.具体产品 西餐饮料
package com.learning.factory.abstract_factory.example;
/**
- 具体产品:西餐饮料
*/
public class WesternDrink implements Drink {
@Override
public void serve() {
System.out.println("供应西餐饮料");
}
}
- 具体产品:西餐饮料
-
7.抽象工厂
package com.learning.factory.abstract_factory.example;
/**
-
抽象工厂
/
public interface RestaurantFactory {
/*- 创建食物
- @return
*/
Food createFood();
/**
- 创建饮料
- @return
*/
Drink createDrink();
}
-
-
8.具体工厂 中餐工厂
package com.learning.factory.abstract_factory.example;
/**
-
具体工厂:中餐工厂
*/
public class ChineseRestaurantFactory implements RestaurantFactory {
@Override
public Food createFood() {
return new ChineseFood();
}@Override
public Drink createDrink() {
return new ChineseDrink();
}
}
-
-
9.具体工厂 西餐工厂
package com.learning.factory.abstract_factory.example;
/**
-
具体工厂:西餐工厂
*/
public class WesternRestaurantFactory implements RestaurantFactory {
@Override
public Food createFood() {
return new WesternFood();
}@Override
public Drink createDrink() {
return new WesternDrink();
}
}
-
-
10.客户端
package com.learning.factory.abstract_factory.example;
/**
-
客户端
*/
public class RestaurantClient {
public static void main(String[] args) {
// 使用中餐工厂
RestaurantFactory chineseFactory = new ChineseRestaurantFactory();
Food chineseFood = chineseFactory.createFood();
chineseFood.prepare();Drink chineseDrink = chineseFactory.createDrink(); chineseDrink.serve(); // 使用西餐工厂 RestaurantFactory westernFactory = new WesternRestaurantFactory(); Food westernFood = westernFactory.createFood(); westernFood.prepare(); Drink westernDrink = westernFactory.createDrink(); westernDrink.serve();
}
}
-
-
11.示例截图