设计模式之抽象工厂

简介: 设计模式之抽象工厂

软件架构师需要评审概要设计并检查概要设计是否落实,所以设计模式是重点内容之一。


由于是演示程序,不考虑内存泄露

现实中,每个公司的产品,都封装成dll或exe中,其他公司是无法查看和修改的。

公司一定义了类库的标准,公司二和公司三,分别实现了此类库。公司四建立一个产品,公司五在公司四的产品上二次开发。

公司四2014年使用公司二的类库,公司四2015年使用公司三的类库,这对公司五没有任何影响。

使用VC6建立一个基于对话框的程序test1,增加两个按钮,并关联响应函数,主要代码如下:

//第一个公司的产品,定义了接口
//IUnit
class IUnit 
{
public:
  virtual void Draw(CDC& dc)=0; 
};
//IText 文本接口类
class IText : public IUnit
{
public:
  virtual void SetText(const char* pText)=0;
};
//文本类的简单实现
class CText : public IText
{
public :
  virtual void SetText(const char* pText);
protected:
  CString m_strText;
};
void CText::SetText(const char* pText)
{
  m_strText = pText ;
}
//工厂接口类
class IFactory
{
public:
  virtual IText* CreateText()=0;//创建文件类
  //创建图片等类省略
};
//第二个公司的实现
class CText1 : public CText
{
public:
  virtual void Draw(CDC& dc);
};
void CText1::Draw(CDC& dc)
{
  dc.FillRect(CRect(30,30,100,100),&CBrush(RGB(0,255,255)));
  dc.SetTextColor(RGB(255,0,0));
  dc.TextOut(30,30,m_strText);
}
class CFactory1 : public IFactory
{
public :
  virtual IText* CreateText();
};
IText* CFactory1::CreateText()
{
  return new CText1();
}
//第三个公司的实现
class CText2 : public CText
{
public:
  virtual void Draw(CDC& dc);
};
void CText2::Draw(CDC& dc)
{
  dc.FillRect(CRect(30,30,100,100),&CBrush(RGB(255,0,255)));
  dc.SetTextColor(RGB(0,255,0));
  dc.TextOut(30,30,m_strText);
}
class CFactory2 : public IFactory
{
public :
  virtual IText* CreateText();
};
IText* CFactory2::CreateText()
{
  return new CText2();
}
//第四个公司(主程序的实现方)
extern IUnit* Init(IFactory& factory);
void CTest1Dlg::OnButton1() 
{
  //第四个公司的2015年的现实
  IUnit* p = Init(CFactory1());
  CWindowDC dc(this);
  p->Draw(dc);
}
void CTest1Dlg::OnButton2() 
{
  //第四个公司的2016年的现实
  IUnit* p = Init(CFactory2());
  CWindowDC dc(this);
  p->Draw(dc);
}
//第五个公司的实现
IUnit* Init(IFactory& factory)
{ 
  IText* p = factory.CreateText();
  p->SetText("尚贤");
  return p;
}
//第六个公司返回的可能是logo图片(本实例中没实现)而不是文本


公司一类图:

公司二(三)类图

公司四类图

公司五类图


从以上类图可以看出:

公司二(公司三)只需要关心公司一

公司四只需要关心公司一和公司二(三)

公司五只需要要关系公司一


相关文章
|
6月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
6月前
|
设计模式 Java
常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)
有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法,观察者模式,策略模式)
60 2
|
设计模式 Java 关系型数据库
解锁设计模式的神秘面纱:编写无懈可击的代码之抽象工厂设计模式
解锁设计模式的神秘面纱:编写无懈可击的代码之抽象工厂设计模式
45 0
|
6月前
|
设计模式
设计模式-抽象工厂
设计模式-抽象工厂
|
2月前
|
设计模式
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
这篇文章详细解释了工厂模式,包括简单工厂、工厂方法和抽象工厂三种类型。每种模式都通过代码示例展示了其应用场景和实现方法,并比较了它们之间的差异。简单工厂模式通过一个工厂类来创建各种产品;工厂方法模式通过定义一个创建对象的接口,由子类决定实例化哪个类;抽象工厂模式提供一个创建相关或依赖对象家族的接口,而不需要明确指定具体类。
设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
43 3
|
5月前
|
设计模式 Java
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
Java设计模式:工厂模式之简单工厂、工厂方法、抽象工厂(三)
|
5月前
|
设计模式 Java
设计模式-抽象工厂(JAVA)
设计模式-抽象工厂(JAVA)
|
6月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
67 1
|
6月前
|
设计模式 Java 数据库连接
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别
设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory)、工厂方法(Factory Method)和抽象工厂(Abstract Factory)。那么三者有什么区别呢?
163 1
Java设计模式--简单工厂、工厂方法和抽象工厂之间的区别