1. 说明
- 1.提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
- 2.抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式。
- 3.抽象工厂模式用于系统的产品族,而不仅仅是一个等级结构;一个等级的抽象类只能创建一个等级的产品,而抽象工厂模式能创建多个等级的产品。
2. 应用场景
- 1.当一个系统不应当依赖于产品类实例如何被创建、组合和表示的细节时。
- 2.当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
- 3.属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
- 4.系统提供一个产品类的库,并希望系统的设计独立于这些产品的实现时。
3. 结构图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/baf9d0a39d924801b17aa0094bf4ee7b.png)
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示例
package com.learning.factory.abstract_factory.example;
/**
* 抽象产品:食物
*/
public interface Food {
void prepare();
}
package com.learning.factory.abstract_factory.example;
/**
* 抽象产品:饮料
*/
public interface Drink {
void serve();
}
package com.learning.factory.abstract_factory.example;
/**
* 具体产品:中餐食物
*/
public class ChineseFood implements Food {
@Override
public void prepare() {
System.out.println("准备中餐食物");
}
}
package com.learning.factory.abstract_factory.example;
/**
* 具体产品:中餐饮料
*/
public class ChineseDrink implements Drink {
@Override
public void serve() {
System.out.println("供应中餐饮料");
}
}
package com.learning.factory.abstract_factory.example;
/**
* 具体产品:西餐食物
*/
public class WesternFood implements Food {
@Override
public void prepare() {
System.out.println("准备西餐食物");
}
}
package com.learning.factory.abstract_factory.example;
/**
* 具体产品:西餐饮料
*/
public class WesternDrink implements Drink {
@Override
public void serve() {
System.out.println("供应西餐饮料");
}
}
package com.learning.factory.abstract_factory.example;
/**
* 抽象工厂
*/
public interface RestaurantFactory {
/**
* 创建食物
* @return
*/
Food createFood();
/**
* 创建饮料
* @return
*/
Drink createDrink();
}
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();
}
}
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();
}
}
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.示例截图
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8e3f66b7d4b24565953e305d485e81aa.png)