百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

C++/C#/Java 设计模式之抽象工厂模式

liebian365 2024-11-17 13:17 22 浏览 0 评论

设计模式之抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单独工厂。抽象工厂模式通过提供一个超级工厂创建其他工厂的接口,使得客户端使用抽象的接口操作具体对象,从而实现客户端与具体工厂类解耦。

使用C++实现抽象工厂模式(Abstract Factory)

下面是一个使用C++实现抽象工厂模式的例子:

#include <iostream>
#include <string>

// 抽象产品A
class AbstractProductA {
public:
virtual ~AbstractProductA() {}
virtual std::string use() = 0;
};

// 抽象产品B
class AbstractProductB {
public:
virtual ~AbstractProductB() {}
virtual std::string eat() = 0;
};

// 具体产品A1
class ProductA1 : public AbstractProductA {
public:
std::string use() override {
return "Using Product A1";
}
};

// 具体产品A2
class ProductA2 : public AbstractProductA {
public:
std::string use() override {
return "Using Product A2";
}
};

// 具体产品B1
class ProductB1 : public AbstractProductB {
public:
std::string eat() override {
return "Eating Product B1";
}
};

// 具体产品B2
class ProductB2 : public AbstractProductB {
public:
std::string eat() override {
return "Eating Product B2";
}
};

// 抽象工厂
class AbstractFactory {
public:
virtual ~AbstractFactory() {}
virtual AbstractProductA* createProductA() = 0;
virtual AbstractProductB* createProductB() = 0;
};

// 具体工厂1
class Factory1 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ProductA1();
}
AbstractProductB* createProductB() override {
return new ProductB1();
}
};

// 具体工厂2
class Factory2 : public AbstractFactory {
public:
AbstractProductA* createProductA() override {
return new ProductA2();
}
AbstractProductB* createProductB() override {
return new ProductB2();
}
};

// 客户端代码
void clientCode(AbstractFactory* factory) {
AbstractProductA* productA = factory->createProductA();
AbstractProductB* productB = factory->createProductB();

std::cout << productA->use() << std::endl;
std::cout << productB->eat() << std::endl;

delete productA;
delete productB;
}

int main() {
AbstractFactory* factory1 = new Factory1();
AbstractFactory* factory2 = new Factory2();

std::cout << "Using the products created by Factory 1:" << std::endl;
clientCode(factory1);

std::cout << "Using the products created by Factory 2:" << std::endl;
clientCode(factory2);

delete factory1;
delete factory2;

return 0;
}

运行结果如下所示:

image-20241012095327960

在这个例子中,我们定义了两个抽象产品类AbstractProductAAbstractProductB,以及两个具体产品类ProductA1ProductA2ProductB1ProductB2。我们还定义了一个抽象工厂类AbstractFactory,以及两个具体工厂类Factory1Factory2

客户端代码使用抽象工厂接口来创建具体产品,并使用这些产品。通过使用抽象工厂模式,我们可以在不改变客户端代码的情况下,改变具体工厂类和具体产品类。

使用C#实现抽象工厂模式(Abstract Factory)

namespace Abstract_Factory_Pattern
{
internal class Program
{
public interface ILaptop
{
void ShowSpecs();
}

public interface IDesktop
{
void ShowSpecs();
}

// Apple 品牌的产品
public class AppleLaptop : ILaptop
{
public void ShowSpecs()
{
Console.WriteLine("Apple Laptop Specifications");
}
}

public class AppleDesktop : IDesktop
{
public void ShowSpecs()
{
Console.WriteLine("Apple Desktop Specifications");
}
}

// Lenovo 品牌的产品
public class LenovoLaptop : ILaptop
{
public void ShowSpecs()
{
Console.WriteLine("Lenovo Laptop Specifications");
}
}

public class LenovoDesktop : IDesktop
{
public void ShowSpecs()
{
Console.WriteLine("Lenovo Desktop Specifications");
}
}

public interface IComputerFactory
{
ILaptop CreateLaptop();
IDesktop CreateDesktop();
}

public class AppleFactory : IComputerFactory
{
public ILaptop CreateLaptop()
{
return new AppleLaptop();
}

public IDesktop CreateDesktop()
{
return new AppleDesktop();
}
}

public class LenovoFactory : IComputerFactory
{
public ILaptop CreateLaptop()
{
return new LenovoLaptop();
}

public IDesktop CreateDesktop()
{
return new LenovoDesktop();
}
}

static void Main(string[] args)
{

// 创建工厂
IComputerFactory appleFactory = new AppleFactory();
IComputerFactory lenovoFactory = new LenovoFactory();

// 创建 Apple 产品的笔记本和台式机
ILaptop appleLaptop = appleFactory.CreateLaptop();
IDesktop appleDesktop = appleFactory.CreateDesktop();
appleLaptop.ShowSpecs();
appleDesktop.ShowSpecs();

// 创建 Lenovo 产品的笔记本和台式机
ILaptop lenovoLaptop = lenovoFactory.CreateLaptop();
IDesktop lenovoDesktop = lenovoFactory.CreateDesktop();
lenovoLaptop.ShowSpecs();
lenovoDesktop.ShowSpecs();
}
}
}

运行结果如下所示:

image-20241012151046022

使用Java实现抽象工厂模式

package src.Design_Patterns;

public class Abstract_Factory_Pattern
{
public interface Laptop
{
void showSpecs();
}

public interface Desktop
{
void showSpecs();
}

// Apple 品牌的产品
public class AppleLaptop implements Laptop {
@Override
public void showSpecs() {
System.out.println("Apple Laptop Specifications");
}
}

public class AppleDesktop implements Desktop {
@Override
public void showSpecs() {
System.out.println("Apple Desktop Specifications");
}
}

// Lenovo 品牌的产品
public class LenovoLaptop implements Laptop {
@Override
public void showSpecs() {
System.out.println("Lenovo Laptop Specifications");
}
}

public class LenovoDesktop implements Desktop {
@Override
public void showSpecs() {
System.out.println("Lenovo Desktop Specifications");
}
}

public interface ComputerFactory {
Laptop createLaptop();
Desktop createDesktop();
}

public class AppleFactory implements ComputerFactory {
@Override
public Laptop createLaptop() {
return new AppleLaptop();
}

@Override
public Desktop createDesktop() {
return new AppleDesktop();
}
}

public class LenovoFactory implements ComputerFactory {
@Override
public Laptop createLaptop() {
return new LenovoLaptop();
}

@Override
public Desktop createDesktop() {
return new LenovoDesktop();
}
}

public void test()
{
// 创建工厂
ComputerFactory appleFactory = new AppleFactory();
ComputerFactory lenovoFactory = new LenovoFactory();

// 创建 Apple 产品的笔记本和台式机
Laptop appleLaptop = appleFactory.createLaptop();
Desktop appleDesktop = appleFactory.createDesktop();
appleLaptop.showSpecs();
appleDesktop.showSpecs();

// 创建 Lenovo 产品的笔记本和台式机
Laptop lenovoLaptop = lenovoFactory.createLaptop();
Desktop lenovoDesktop = lenovoFactory.createDesktop();
lenovoLaptop.showSpecs();
lenovoDesktop.showSpecs();
}

public static void main(String[] args) {
Abstract_Factory_Pattern afp = new Abstract_Factory_Pattern();
afp.test();
}

}

运行结果如下所示:

image-20241012152602182


相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: