02.工厂模式--Factory

本文介绍了Factory模式的基本概念,探讨了该模式解决的两类常见问题,并通过一个数学运算的例子详细展示了模式的具体实现过程。

原文地址:http://blog.youkuaiyun.com/jjunjoe/article/details/6623442

Factory模式:
Factory模式定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory模式使一个类的实例化延迟到其子类

在面向对象系统设计中经常可以遇到以下的两类问题:
1) 为了提高内聚(Cohesion)和松耦合(Coupling),我们经常会抽象出一些类的公共接口以形成抽象基类或者接口。这样我们可以通过声明一个指向基类的指针来指向实际的子类实现,达到了多态的目的。
2) 还有一种情况就是在父类中并不知道具体要实例化哪一个具体的子类。

以上两个问题也就引出了Factory模式的两个最重要的功能:
1)定义创建对象的接口,封装了对象的创建;
2)使得具体化类的工作延迟到了子类中。

Factory模式的问题:
1. 每增加一个具体的Product,Factory就必须对它处理,这样Factory就永远不可能封闭了。
2. Factory模式仅仅局限于一类类(就是说Product是一类,有一个共同的基类),如果我们要为不同类的类提供一个对象创建的接口,那就要用AbstractFactory了。

Factory模式的结构图1:
 

Factory模式的结构图2:
 

以《大话设计模式》中的例子为代表,上面所说的Product就是数学运算。
Factory模式的实现代码:

// Factory.h

// 数学运算的基类
class Operator
{
protected:
 int m_iNumberA;
 int m_iNumberB;

public:
 virtual int GetResult()
 {
  return 0;
 }

 void SetOperatorNumber(int iNumberA, int iNumberB)
 {
  m_iNumberA = iNumberA;
  m_iNumberB = iNumberB;
 }
};

// 加法
class OperatorAdd : public Operator
{
 virtual int GetResult()
 {
  return m_iNumberA + m_iNumberB;
 }
};

// 减法
class OperatorSub : public Operator
{
 virtual int GetResult()
 {
  return m_iNumberA - m_iNumberB;
 }
};

// 乘法
class OperatorMul : public Operator
{
 virtual int GetResult()
 {
  return m_iNumberA * m_iNumberB;
 }
};

// 除法
class OperatorDiv : public Operator
{
 virtual int GetResult()
 {
  if ( m_iNumberB != 0 )
  {
   return m_iNumberA / m_iNumberB;
  }
  
  // 这里要加除数为0异常处理
  return 0;
 }
};


// 运算的工厂类
class OperatorFactory
{
public:
 static Operator* CreateOperator(char chOperator)
 {
  Operator* pOperator = NULL;

  switch( chOperator )
  {
  case '+':
   pOperator = new OperatorAdd();
   break;
  
  case '-':
   pOperator = new OperatorSub();
   break;
  
  case '*':
   pOperator = new OperatorMul();
      break;
  
  case '/':
   pOperator = new OperatorDiv();
      break;
  
  default:
      break;
  }

  return pOperator;
 }
};

// main.cpp

#include <iostream>
using namespace std;
#include "Factory.h"
void main()
{
 // 对于客户端来说,不需要知道具体的运算类的细节
 // 加
 Operator* pOpAdd = OperatorFactory::CreateOperator('+');
 pOpAdd->SetOperatorNumber(10, 5);
 cout << pOpAdd->GetResult() << endl;
 delete pOpAdd;
 pOpAdd = NULL;

 // 减
 Operator* pOpSub = OperatorFactory::CreateOperator('-');
 pOpSub->SetOperatorNumber(10, 5);
 cout << pOpSub->GetResult() << endl;
 delete pOpSub;
 pOpSub = NULL;

 // 乘
 Operator* pOpMul = OperatorFactory::CreateOperator('*');
 pOpMul->SetOperatorNumber(10, 5);
 cout << pOpMul->GetResult() << endl;
 delete pOpMul;
 pOpMul = NULL;

 // 除
 Operator* pOpDiv = OperatorFactory::CreateOperator('/');
 pOpDiv->SetOperatorNumber(10, 5);
 cout << pOpDiv->GetResult() << endl;
 delete pOpDiv;
 pOpDiv = NULL;
}
如上源码所示,如果再需要增加其他运算,只需要添加对应的运算子类的代码(其他运算类的细节不需要让修改者知道),然后修改运算类工厂。





【3D应力敏感度分析拓扑优化】【基于p-范数全局应力衡量的3D敏感度分析】基于伴随方法的有限元分析和p-范数应力敏感度分析(Matlab代码实现)内容概要:本文档介绍了基于伴随方法的有限元分析与p-范数全局应力衡量的3D应力敏感度分析,并结合拓扑优化技术,提供了完整的Matlab代码实现方案。该方法通过有限元建模计算结构在载荷作用下的应力分布,采用p-范数对全局应力进行有效聚合,避免传统方法中应力约束过多的问题,进而利用伴随法高效求解设计变量对应力的敏感度,为结构优化提供关键梯度信息。整个流程涵盖了从有限元分析、应力评估到敏感度计算的核心环节,适用于复杂三维结构的轻量化与高强度设计。; 适合人群:具备有限元分析基础、拓扑优化背景及Matlab编程能力的研究生、科研人员与工程技术人员,尤其适合从事结构设计、力学仿真与多学科优化的相关从业者; 使用场景及目标:①用于实现高精度三维结构的应力约束拓扑优化;②帮助理解伴随法在敏感度分析中的应用原理与编程实现;③服务于科研复现、论文写作与工程项目中的结构性能提升需求; 阅读建议:建议读者结合有限元理论与优化算法知识,逐步调试Matlab代码,重点关注伴随方程的构建与p-范数的数值处理技巧,以深入掌握方法本质并实现个性化拓展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值