当前位置: 首页 > news >正文

[Design Pattern] 工厂方法模式

工厂方法模式

让一个具体的类对应一个工厂。然后把所有工厂进行抽象。通过抽象工厂实现具体的工厂来创建对象。如果需要新增一个类,那么就需要创建一个工厂类来创建对象

优点:

1. 符合开闭原则。是简单工厂改进

2. 实现创建和使用分离

缺点:

1. 类的个数庞大。增加一个具体对象类就需要增加一个对应工厂类。增加维护成本

参考代码:

class Fruit
{
public:
    virtual void showName() = 0;
};

class Apple : public Fruit
{
public:
    virtual void showName()
    {
        cout << "I am apple." << endl;
    }
};
class Banana : public Fruit
{
public:
    virtual void showName()
    {
        cout << "I am banana." << endl;
    }
};
class Pear : public Fruit
{
public:
    virtual void showName()
    {
        cout << "I am pear." << endl;
    }
};

class FactoryMethod
{
public:
    virtual Fruit* createFruit() = 0;
};

class AppleFactory : public FactoryMethod
{
public:
    virtual Fruit* createFruit()
    {
        return new Apple();
    }
};
class BananaFactory : public FactoryMethod
{
public:
    virtual Fruit* createFruit()
    {
        return new Banana();
    }
};
class PearFactory : public FactoryMethod
{
public:
    virtual Fruit* createFruit()
    {
        return new Pear();
    }
};

int main()
{
    FactoryMethod* factory = new AppleFactory();
    Fruit* apple = factory->createFruit();
    apple->showName();
    delete factory;
    delete apple;
    return 0;
}

 适用场景

1. 客户端不知道它锁需要对象的类

2. 抽象工厂类通过其子类来指定创建哪个对象

转载于:https://www.cnblogs.com/immjc/p/9120699.html

相关文章:

  • (转)一些感悟
  • 云效(阿里云)流水线 + nginx + uWsgi + flask + python3 基础环境搭建 --备忘
  • 一个经典的并发导致异常的场景
  • Android 自定义Behavior
  • maven 配置环境变量
  • 使用本地缓存快还是使用redis缓存好?
  • POJ 1298 - The Hardest Problem Ever(模拟)
  • [Window编程][VC6.0++][error LNK2001: unresolved external symbol __imp__PlaySoundA@12]
  • 【安富莱专题教程第4期】SEGGER的J-Scope波形上位机软件,HSS模式简单易用,无需额外资源,也不需要写目标板代码...
  • 手动搭建OpenStack(Ocata版)
  • Vue - 动态组件 异步组件
  • 【查找网站后台的方法】
  • 构建之法第四章两人合作
  • C++虚函数表解析***
  • 缓存一致
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 2019年如何成为全栈工程师?
  • C++类中的特殊成员函数
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • JAVA之继承和多态
  • js对象的深浅拷贝
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL用户中的%到底包不包括localhost?
  • Python - 闭包Closure
  • React as a UI Runtime(五、列表)
  • SQL 难点解决:记录的引用
  • Sublime text 3 3103 注册码
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 关于Java中分层中遇到的一些问题
  • 两列自适应布局方案整理
  • 前端面试总结(at, md)
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用parted解决大于2T的磁盘分区
  • 事件委托的小应用
  • 首页查询功能的一次实现过程
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 再次简单明了总结flex布局,一看就懂...
  • ​力扣解法汇总946-验证栈序列
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #include
  • #QT(串口助手-界面)
  • $GOPATH/go.mod exists but should not goland
  • (16)Reactor的测试——响应式Spring的道法术器
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)计算机毕业设计高校学生选课系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (三)终结任务
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)Android学习笔记 --- android任务栈和启动模式
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .net FrameWork简介,数组,枚举
  • .NET Micro Framework初体验