对象创建模式

通过“对象创建”模式绕开new ,来避免对象创建( new )过程中所导致的紧耦合(依赖具体类) , 从而支持对象创建的稳定。它是接口抽象之后的第一步工作。

典型模式

  • Factory Method
  • Abstract Factory
  • Prototype
  • Builder

工厂方法(Factory Method)

  • 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
  • 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?

定义

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。

要点总结

  • Factory Method模式用于隔离类对象的使用者和具体类型之间的 耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导 致软件的脆弱。
  • Factory Method模式通过面向对象的手法,将所要创建的具体对 象工作延迟到子类,从而实现一种扩展(而非更改)的策略,较好地解决了这种紧耦合关系。
  • Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

cpp

#include<iostream>

//抽象类
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {}
}; //工厂基类
class SplitterFactory {
public:
virtual ISplitter* CreateSplitter() = 0;
virtual ~SplitterFactory() {}
}; //具体类
class BinarySplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "BinarySplitter" << std::endl;
}
}; class TxtSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "TxtSplitter" << std::endl;
}
}; class PictureSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "PictureSplitter" << std::endl;
}
}; class VideoSplitter : public ISplitter {
public:
virtual void split()
{
std::cout << "VideoSplitter" << std::endl;
}
}; //具体工厂
class BinarySplitterFactory : public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() override {
return new BinarySplitter;
}
}; class TxtSplitterFactory : public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() override {
return new TxtSplitter;
}
}; class PictureSplitterFactory : public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() override {
return new PictureSplitter;
}
}; class VideoSplitterFactory : public SplitterFactory {
public:
virtual ISplitter* CreateSplitter() override {
return new VideoSplitter;
}
}; class Form
{
//...
}; class MainForm :public Form
{
public:
MainForm(SplitterFactory* factory)
{
this->factory = factory;
}
void Button_Click()
{
ISplitter* splitter = factory->CreateSplitter();
splitter->split();
}
//...
private:
//...
SplitterFactory* factory;
}; int main()
{
SplitterFactory* Binary = new BinarySplitterFactory();
MainForm* formBinary = new MainForm(Binary);
formBinary->Button_Click(); SplitterFactory* Txt = new TxtSplitterFactory();
MainForm* formTxt = new MainForm(Txt);
formTxt->Button_Click(); SplitterFactory* Picture = new PictureSplitterFactory();
MainForm* formPicture = new MainForm(Picture);
formPicture->Button_Click(); SplitterFactory* Video = new VideoSplitterFactory();
MainForm* formVideo = new MainForm(Video);
formVideo->Button_Click(); return 0;
}

C++设计模式 - 工厂方法(Factory Method)的更多相关文章

  1. 设计模式——工厂方法(Factory Method)

    定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. ——DP UML类图 模式说明 抽象业务基类 实际业务类的公共基类,也是工厂要创建的所有对象的父类,这部分 ...

  2. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  3. Spring 通过工厂方法(Factory Method)来配置bean

    Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...

  4. [设计模式-创建型]工厂方法(Factory Method)

    概括 名称 Factory Method 结构 动机 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. 适用性 当一个类不知道它所必 ...

  5. 设计模式二: 工厂方法(Factory Method)

    简介 工厂方法模式是创建型模式的一种, 核心结构有四个角色: 抽象工厂,具体工厂,抽象产品,具体产品; 实现层面上,该模式定义一个创建产品的接口,将实际创建工作推迟到具体工厂类实现, 一个产品对应一个 ...

  6. Headfirst设计模式的C++实现——工厂方法(Factory Method)

    引用原书的一句话:所有的工厂模式都用来封装对象的创建,工厂方法模式通过让子类决定该创建的对象是什么来达到封装的目的. Pizza类及其派生类与上一例相同 PizzaStore.h #ifndef _P ...

  7. 工厂方法 Factory Method

    背景:有一个应用框架,它可以向用户显示多个文档.在这个框架中,两个主要的抽象是类Application和Document.这两个类都是抽象的.客户必须通过它们的子类来做与举替应用相关的实现. 分析:因 ...

  8. 设计模式——工厂模式(Factory Method)

    工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...

  9. 设计模式学习心得<工厂方法 Factory Method>

    概述 意图 业务代码中常常有构造对象的过程,它拥有大量的参数.并且有很多地方需要这对象. 简化对象构造过程. 主要解决 一个类在不同场景的频繁地创建,让不同对象的创建更有语义化,提高代码复用性. 何时 ...

  10. Java设计模式-工厂方法模式(Virtual Constructor/Polymorphic Factory)

    工厂方法模式(Virtual Constructor/Polymorphic Factory) 工厂方法模式是类的创建模式,又叫做虚拟构造子模式(Virtual Constructor)或者多态性工厂 ...

随机推荐

  1. 《深入理解Java虚拟机》(三)类加载机制

    @ 目录 1.什么是类的加载 2.类加载的过程 加载 连接 验证 文件格式验证 元数据验证 字节码验证 符号引用验证 准备 解析: 类或接口的解析 字段解析 类方法解析 接口方法解析 初始化 结束生命 ...

  2. New Questions

    1. C++/Qt 实现一个信号槽 #include <functional> #include <iostream> #include <vector> clas ...

  3. vue实现导出word文档(含多张图片)

    vue实现导出word文档(含多张图片) 转自: https://www.pudn.com/news/62e1e14e55398e076bea2d2f.html

  4. 【笔记】css —— BFC 原理

    一.什么是 BFC BFC 即 Block Formatting Contexts (块级格式化上下文),具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素 ...

  5. sql题目---day39

    # 1.查询所有的课程的名称以及对应的任课老师姓名 #where select teacher.tname,course.cname from teacher,course where course. ...

  6. centos7安装桌面-GNOME

    CENTOS7安装桌面系统 GNOME桌面 # yum安装 # 更新已安装软件 yum upgrade -y # 安装额外yum源 yum install epel-release -y # 安装X ...

  7. Oracle设置日志参数-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

    要实现两个数据库之间的实时同步,需要给Oracle设置参数 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 执行了12小时,等待数据库中的其它事务都提交以后才 ...

  8. pip相关知识

    正常安装语法 # 安装单个 pip install some-package # 安装指定版本 pip install some-package==版本号 # 查看当前模块版本号 pip instal ...

  9. Hello-FPGA CoaXPress 2.0 FPGA DEVICE IP Core Demo

    Hello-FPGA CoaXPress 2.0 Device FPGA IP Core Demo 1     说明 本手册针对Helllo-FPGA的CoaXPress 2.0 DEVICE FPG ...

  10. Elasticsearch使用实战以及代码详解

    Elasticsearch 是一个使用 Java 语言编写.遵守 Apache 协议.支持 RESTful 风格的分布式全文搜索和分析引擎,它基于 Lucene 库构建,并提供多种语言的 API.El ...