【设计模式 03】抽象工厂模式

一个具体的工厂,可以专门生产单一某一种东西,比如说只生产手机。但是一个品牌的手机有高端机、中端机之分,这些具体的属于某一档次的产品都需要单独建立一个工厂类,但是它们之间又彼此关联,因为都共同属于一个品牌。我们说这种叫做“多类”对象

除了手机之外,还有比如沙发、茶几、椅子,不同于手机的高端型号和低端型号,取而代之的可以是不同的样式风格,比如古典风格的和现代风格的。每一种风格的产品都需要单独建立一个工厂类,但是他们本质上都属于同一样东西。我们可以从这个角度理解“多类对象”,即,就是同一对象的多种类别。

图中包含以下元素:

  • 抽象产品接口:AbstractProduct
  • 具体产品类:ConcreteProduct
  • 抽象工厂接口:AbstractFactory
  • 具体工厂类:ConcreateFactory

 Java代码:

// 1. 定义抽象产品
// 抽象产品A
interface ProductA {void display();
}// 抽象产品B
interface ProductB {void show();
}// 2. 实现具体产品类
// 具体产品A1
class ConcreteProductA1 implements ProductA {@Overridepublic void display() {System.out.println("Concrete Product A1");}
}// 具体产品A2
class ConcreteProductA2 implements ProductA {@Overridepublic void display() {System.out.println("Concrete Product A2");}
}// 具体产品B1
class ConcreteProductB1 implements ProductB {@Overridepublic void show() {System.out.println("Concrete Product B1");}
}// 具体产品B2
class ConcreteProductB2 implements ProductB {@Overridepublic void show() {System.out.println("Concrete Product B2");}
}// 3. 定义抽象工厂接口
interface AbstractFactory {ProductA createProductA();ProductB createProductB();
}// 4. 实现具体工厂类
// 具体工厂1,生产产品A1和B1
class ConcreteFactory1 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA1();}@Overridepublic ProductB createProductB() {return new ConcreteProductB1();}
}// 具体工厂2,生产产品A2和B2
class ConcreteFactory2 implements AbstractFactory {@Overridepublic ProductA createProductA() {return new ConcreteProductA2();}@Overridepublic ProductB createProductB() {return new ConcreteProductB2();}
}// 客户端代码
public class AbstractFactoryExample {public static void main(String[] args) {// 使用工厂1创建产品A1和产品B1AbstractFactory factory1 = new ConcreteFactory1();ProductA productA1 = factory1.createProductA();ProductB productB1 = factory1.createProductB();productA1.display();productB1.show();// 使用工厂2创建产品A2和产品B2AbstractFactory factory2 = new ConcreteFactory2();ProductA productA2 = factory2.createProductA();ProductB productB2 = factory2.createProductB();productA2.display();productB2.show();}
}

为了避免跟之前的工厂方法模式混淆,这里做一个区别:

  • 简单工厂模式:一个工厂方法创建所有具体产品
  • 工厂方法模式:一个工厂方法创建一个具体产品
  • 抽象工厂模式:一个工厂方法创建一个具体产品的某一类

典型的应用场景是,使用抽象工厂模式来创建与不同数据库的连接对象。

总结一下就是抽象工厂模式特别适用于一系列相关或相互依赖的产品被一起创建的情况。

当需要增加新产品时(是新产品而不是某一产品的新型号),则需要增加新的具体产品类,然后修改抽象工厂接口以及所有的具体工厂类,扩展性相对较差。

【设计模式专题之抽象工厂模式】3. 家具工厂

CPP版代码:

#include <iostream>
#include <string>// 抽象椅子接口
class Chair {
public:virtual void showInfo() = 0;
};// 具体现代风格椅子
class ModernChair : public Chair {
public:void showInfo() override {std::cout << "modern chair" << std::endl;}
};// 具体古典风格椅子
class ClassicalChair : public Chair {
public:void showInfo() override {std::cout << "classical chair" << std::endl;}
};// 抽象沙发接口
class Sofa {
public:virtual void displayInfo() = 0;
};// 具体现代风格沙发
class ModernSofa : public Sofa {
public:void displayInfo() override {std::cout << "modern sofa" << std::endl;}
};// 具体古典风格沙发
class ClassicalSofa : public Sofa {
public:void displayInfo() override {std::cout << "classical sofa" << std::endl;}
};// 抽象家居工厂接口
class FurnitureFactory {
public:virtual Chair* createChair() = 0;virtual Sofa* createSofa() = 0;
};// 具体现代风格家居工厂
class ModernFurnitureFactory : public FurnitureFactory {
public:Chair* createChair() override {return new ModernChair();}Sofa* createSofa() override {return new ModernSofa();}
};// 具体古典风格家居工厂
class ClassicalFurnitureFactory : public FurnitureFactory {
public:Chair* createChair() override {return new ClassicalChair();}Sofa* createSofa() override {return new ClassicalSofa();}
};int main() {// 读取订单数量int N;std::cin >> N;// 处理每个订单for (int i = 0; i < N; i++) {// 读取家具类型std::string furnitureType;std::cin >> furnitureType;// 创建相应风格的家居装饰品工厂FurnitureFactory* factory = nullptr;if (furnitureType == "modern") {factory = new ModernFurnitureFactory();} else if (furnitureType == "classical") {factory = new ClassicalFurnitureFactory();}// 根据工厂生产椅子和沙发Chair* chair = factory->createChair();Sofa* sofa = factory->createSofa();// 输出家具信息chair->showInfo();sofa->displayInfo();// 释放动态分配的对象delete chair;delete sofa;delete factory;}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/513132.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib——直方图(python)

需求 假设你获取了250部电影的时长&#xff0c;希望统计出这些电影时长的分布状态等信息。 代码 from matplotlib import pyplot as plt import matplotlibmatplotlib.rc("font",family"FangSong")# 初始化数据 a[131, 98, 125, 131, 124, 139, 131, 1…

面向万物智联的可信连接关键技术研究

文章目录 前言一、万物智联的安全性需求分析二、可信连接技术的发展三、面向万物智联的可信连接关键技术前言 随着5G网络、人工智能以及云计算与容器化等技术的快速进步,物联网的能力与边界已经大大地被拓展,“万物智联”时代正在开启。万物智联在提高生产力的同时,承受的安…

Java Day2 面向对象

这里写目录标题 1、static总结1.1 代码块1.1.1 静态代码块1.1.2 实例代码块1.1.3 小例子 2、继承2.1 权限修饰符2.2 方法重写2.3 子类访问成员特点2.4子类构造器的特点 3、多态4、final、常量4.1 final4.2 常量 5 抽象类5.1 概念5.2 模板设计方法 6、接口6.1 接口新方法6.2 接口…

Spring Cloud 面试题及答案整理,最新面试题

Spring Cloud中断路器的原理及其作用是什么&#xff1f; Spring Cloud断路器的原理和作用基于以下几个关键点&#xff1a; 1、故障隔离机制&#xff1a; 在微服务架构中&#xff0c;断路器作为一种故障隔离机制&#xff0c;当某个服务实例出现问题时&#xff0c;断路器会“断…

动静态库-动态库加载

动静态库 前言引入 一、静态库1. 创建静态库①原理②创建 2. 使用静态库①借助编译选项②只需要带库名 3. 小结 二、动态库1. 创建动态库2. 使用动态库 三、 动态库加载原理——进程地址空间1. 地址①程序没有被加载前的地址②程序加载后的地址 2. 原理①动态库的地址②原理 前…

【AI视野·今日CV 计算机视觉论文速览 第301期】Mon, 4 Mar 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 4 Mar 2024 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Point Could Mamba: Point Cloud Learning via State Space Model Authors Tao Zhang, Xiangtai Li, Haobo Yuan, Shunping …

Python从0到100(二):Python语言介绍及第一个Pyhon程序

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

VELO Angel Glide骑行如风,为你的骑行生活添上一抹亮色~

骑行美学&#xff0c;不就是骑得飞快&#xff0c;姿势还帅吗&#xff1f;但别忘了头盔和护膝&#xff0c;还有多数人忽视的骑行坐垫——毕竟安全骑行才是真的美哦。    我曾经一直苦恼于骑行过程中坐垫为你带来的不适感&#xff0c;也曾萌生退意&#xff0c;直到我遇见了这…

基于springboot+vue的图书管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

JavaScript的`bind`方法:函数的“复制”与“定制”

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

SPC 之 I-MR 控制图

概述 1924 年&#xff0c;美国的休哈特博士应用统计数学理论将 3Sigma 原理运用于生产过程中&#xff0c;并发表了 著名的“控制图法”&#xff0c;对产品特性和过程变量进行控制&#xff0c;开启了统计过程控制新时代。 什么是控制图 控制图指示过程何时不受控制&#xff…

java spring 03 启动细节

spring启动类ClassPathXmlApplicationContext&#xff0c;读取xml文件并且创建bean public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(confi…