网站首页 > 教程分享 正文
基本介绍
抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。
类结构图
类图说明:
- 抽象产品(Abstract Product) 为构成系列产品的一组不同但相关的产品申明接口。
- 具体产品(Concrete Product) 是抽象产品的多种不同类型的实现。所有变体都必须实现相应的抽象产品。
- 抽象工厂(Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
- 具体工厂(Concrete Factory) 实现抽象工厂的构建方法。每个具体的工厂都对应特定产品变体,且仅创建此种产品变体。
- 客户端(Client) 只需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/产品 变体交互。尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品,这样使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。
实现方式
- 以不同的产品类型与产品变体为维度绘制矩阵。
- 为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。
- 声明抽象工厂接口, 并且在接口中为所有抽象产品提供一组构建方法。
- 为每种产品变体实现一个具体工厂类。
- 在应用程序中开发初始化代码。 该代码根据应用程序配置或当前环境, 对特定具体工厂类进行初始化。 然后将该工厂对象传递给所有需要创建产品的类。
- 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。
适用场景
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下,你可以使用抽象工厂。
抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品。
- 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
- 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。
实例代码
- 抽象产品:AbstractProduct
public abstract class AbstractProduct {
/**
* 获取产品名称
* @return
*/
public abstract String productName();
/**
* 获取产品价格
* @return
*/
public abstract long productPrice();
public void show() {
System.out.println("产品名称:" + productName() + ";产品价格:" + productPrice() + "分");
}
}
- 具体的产品:ConcreteProduct1 和 ConcreteProduct2
public class ConcreteProduct1 extends AbstractProduct{
@Override
public String productName() {
return "产品1";
}
@Override
public long productPrice() {
return 10 * 100;
}
}
public class ConcreteProduct2 extends AbstractProduct{
@Override
public String productName() {
return "产品2";
}
@Override
public long productPrice() {
return 20 * 100;
}
}
- 抽象工厂:AbstractProductFactory
public abstract class AbstractProductFactory {
/**
* 创建产品
* @return
*/
public abstract AbstractProduct createProduct();
}
- 具体工厂:ProductFactory1和ProductFactory2
public class ProductFactory1 extends AbstractProductFactory{
@Override
public AbstractProduct createProduct() {
return new ConcreteProduct1();
}
}
public class ProductFactory2 extends AbstractProductFactory {
@Override
public AbstractProduct createProduct() {
return new ConcreteProduct2();
}
}
- 客户端:ClientTest
public class Client {
private final AbstractProductFactory factory;
public Client(AbstractProductFactory factory) {
this.factory = factory;
}
public void show(){
factory.createProduct().show();
}
}
这边我们构造方法根据需要传入不同的具体工厂实现进来。
猜你喜欢
- 2024-10-18 设计模式之 抽象工厂(抽象工厂模式的简单应用)
- 2024-10-18 Aha!设计模式(3)-抽象工厂(2)(抽象工厂模式结构图)
- 2024-10-18 Java经典设计模式-抽象工厂模式(抽象工厂模式在spring的应用)
- 2024-10-18 Java高级编程细节——工厂模式之抽象工厂
- 2024-10-18 java与设计模式-简单工厂-工厂方法-抽象工厂
- 2024-10-18 简单工厂,工厂方法,抽象工厂(简单工厂,工厂方法,抽象工厂区别)
- 2024-10-18 Aha!设计模式(1)-抽象工厂(1)(抽象工厂实例)
- 2024-10-18 抽象工厂模式(Abstract Factory)(抽象工厂模式的意图是)
- 2024-10-18 设计模式记录-抽象工厂模式(抽象工厂模式与工厂方法模式)
- 2024-10-18 你还在new对象吗?用个“抽象工厂模式”生产对象它不香吗
你 发表评论:
欢迎- 最近发表
-
- 有了这份900多页的Android面试指南,你离大厂Offer还远吗?
- K2 Blackpearl 流程平台总体功能介绍:常规流程功能
- 零基础安卓开发起步(一)(安卓开发入门视频)
- 教程:让你的安卓像Windows一样实现程序窗口化运行
- Android事件总线还能怎么玩?(事件总线有什么好处)
- Android 面试被问“谈谈架构”,到底要怎样回答才好?
- Android开发工具Parcel和Serialize
- Android 中Notification的运用(notification widget安卓)
- Android退出所有Activity最优雅的方式
- MT管理器-简单实战-去除启动页(mt管理器怎么去除软件弹窗)
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)