简单工厂(静态工厂)

简单工厂模式是属于创建型模式,又叫做静态工厂。是由一个工厂对象(Factory)决定创建出哪一种产品类(Product)的实例。

设计模式可以结合具体场景进行分析,但不要局限在具体场景中,本文直接使用模型进行说明,相对抽象,但对举一反三有好处。

base.h

#ifndef BASE_H
#define BASE_H

#include <string>
using namespace std;

class IBase
{
public:
    virtual ~IBase();
    virtual const string& getName() const;
    virtual void setName(const string& name);
protected:
    IBase();
    IBase(const string& name);
private:
    string m_name;
};

#endif // BASE_H

base.cpp

#include <iostream>
#include "base.h"

const string& IBase::getName() const
{
    return m_name;
}

void IBase::setName(const string& name)
{
    m_name = name;
}

IBase::IBase()
{
    cout << "constructor IBase" << endl;
}

IBase::IBase(const string& name)
{
    m_name = name;
}

IBase::~IBase()
{
    cout << "destructor IBase" << endl;
}

imp.h

#ifndef IMP_H
#define IMP_H

#include "base.h"

class CImpSamA : public IBase
{
public:
    CImpSamA();
    CImpSamA(string name);
    ~CImpSamA();
    //void FuncSetName(const string& name);
};

class CImpSamB : public IBase
{
public:
    CImpSamB();
    CImpSamB(string name);
    ~CImpSamB();
    //void FuncPrintName() const;
};
#endif // IMP_H

imp.cpp

#include <iostream>
#include "imp.h"

CImpSamA::CImpSamA(string name):IBase(name)
{
    cout << "constructor CImpSamA " << endl;
}

CImpSamA::~CImpSamA()
{
    cout << "destructor CImpSamA " << endl;
}

#if 0
void CImpSamA::FuncSetName(const string& name)
{
    setName(name);
}
#endif

CImpSamB::CImpSamB(string name):IBase(name)
{
    cout << "constructor CImpSamB " << endl;
}

CImpSamB::~CImpSamB()
{
    cout << "destructor CImpSamB " << endl;
}
#if 0
void CImpSamB::FuncPrintName()
{
    cout << getName() << endl;
}
#endif

factory.h

#ifndef FACTORY
#define FACTORY

#include "base.h"
//*注意不能定义成全局静态:全局静态限制作用域为当前文件,main中调用链接会报未定义错误
//使用类的静态成员函数
class CFactory
{
public:
    static IBase* Create(const string& name);
};
//使用具名名字空间中的函数
namespace Factory
{
    IBase* CreateImpA();
}
//直接定义在全局名字空间
IBase* CreateImpB();

#endif // FACTORY

factory.cpp

#include <iostream>
#include "imp.h"
#include "factory.h"

IBase* CFactory::Create(const string& name)
{
    IBase* pImp = NULL;
    if(name.compare("IMPA"))
    {
        pImp = new CImpSamA(name);
    }
    else if(name.compare("IMPB"))
    {
        pImp = new CImpSamB(name);
    }
    else
    {
        cout << "Not matched " << name << endl;
    }
    return pImp;
}

namespace Factory
{
    IBase* CreateImpA()
    {
        return new CImpSamA("CIMPA");
    }
}

IBase* CreateImpB()
{
    return new CImpSamB("CIMPB");
}

main.cpp

#include <QCoreApplication>
#include <iostream>
#include "factory.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    //静态成员函数方法
    IBase* pImp = CFactory::Create("IMPA");
    if(NULL != pImp)
    {
        pImp->setName("New IMPA");
        cout << pImp->getName() << endl;
    }

    pImp = CFactory::Create("IMPB");
    if(NULL != pImp)
    {
        cout << pImp->getName() << endl;
    }

    //全局|静态方法
    pImp = Factory::CreateImpA();
    cout << pImp->getName() << endl;

    pImp = ::CreateImpB();
    cout << pImp->getName() << endl;

    return a.exec();
}

以上class CFactory便是简单工厂或静态工厂实现,Factory具名名字空间和全局名字空间只是工厂实现位置不同而已。

工厂类是关键,包含了必要的逻辑判断,将依赖的具体类型创建工作转移到工厂中去处理,外部只调用工厂提供的接口,只需要包含factory.h和base.h即可实现创建具体对象。不依赖具体实现imp.h
优点:"聚合"了创建工作(内聚到了工厂),和松耦合(依赖共同的抽象接口,不依赖具体实现)。
缺点:将不同对象创建"聚"到一个工厂,而非"内聚"到各对象的内部实现。违反了"高内聚",而且工厂中只能创建已知的类,否则需要修改工厂类,违反了"对扩展开放,对修改封闭"原则。

注意点:

  • 实现上不能定义成全局或者非类名的具名名字空间的静态函数,可以是类静态成员函数或者是普通全局或者具名名字空间的函数。
  • 构造函数 protected,virtual虚析构。
  • 必须需要实现的函数需在base中定义成纯虚接口。

原文地址:https://www.cnblogs.com/kuikuitage/p/10804206.html

时间: 2024-10-14 21:22:23

简单工厂(静态工厂)的相关文章

简单工厂模式(静态工厂方法模式)

以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象.通过多态,返回父类的方式实现了计算器的结果. 1)静态工厂方法统一管理对象的创建. 静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割. 2)静态工厂方法推迟了产品的实例化. 通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译. 简单工厂模式结构图 C++代码实例实现: 1 #include<iostream> 2 using nam

简单工厂模式(静态工厂方法模式)【设计模式】

定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现.被创建实例可以是接口.抽象类,也可以是具体的类.它又称为静态工厂方法(Static Factory Method)模式 简单工厂模式的作用,优点:为客户端屏蔽所需要的实例的具体实现,客户端只需关注某个接口便可,无需关注实现.具体实现被封装起来:客户端和具体实现解耦,客户端只需关注接口,接口的实现变化对客户端没有影响.总结起来,就是封装功能,封转实例的具体实现:解耦功能,接口实现的变化影响不了客户端. 例子: 例子1:不带参数 没有

浅析 抽象工厂、工厂方法、简单(静态)工厂

----简单工厂 (也叫静态工厂模式):一个抽象产品抽象出多个具体产品类,一个具体工厂类 代码: //抽象产品角色 public interface Car{ public void drive(); } //具体产品角色 public class Benz implements Car{ public void drive() { System.out.println("Driving Benz "); } } public class Bmw implements Car{ pub

简单工厂模式(静态工厂)和工厂方法模式和抽象工厂模式

首先是简单工厂模式. 一句话描述就是用一个工厂类去封装new的工厂,返回新建的一个对象的引用.如果这个方法是静态的,就称之为静态工厂.一般来说这种做法很常见,尤其在一些JAVA工具类中.它的好处和坏处网上的分析都很多,但我觉得没必要分的这么细.最最最直接的好处是用起来简单,方便和不容易出错. 工厂方法模式则复杂一点.它的做法是在父类声明一个final方法用来真正被外部调用(在子类中被继承但是不允许覆盖).在这个方法中调用一个抽象方法去具体实现新建对象,可是这个抽象方法本身由子类实现. 举个例子就

php设计模式 — 简单工厂模式(静态工厂方法模式)

概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory) |又叫做  静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit) 配图 代码实例 直接将代码运行即可,

Java 设计模式之 简单工厂模式(静态工厂方法模式)

简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(或者父接口). 简单工厂模式的  UML 图: (1)抽象(Product)产品角色:简单工厂模式所创建的所有对象的父类,注意,这里的父类可以是接口也可以是抽象类,它负责描述所有实例所共有的公共接口. (2)具体产品(Concrete Product)角色:简

简单工厂模式(静态工厂模式)

1.定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类.因为在简单工厂模式中用于创建实例的方法是静态方法,因此简单工厂模式又被称为静态工厂方法模式,它属于类创建型模型.2.简单工厂模式包括:2.1.Factory(工厂角色):工厂角色即工厂类,他是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑:工厂类可以被外界直接调用,创建所需的产品对象:在工厂类中提供了静态工厂方法factoryMethod(),它返回类型为抽象产品类型Product.2.2.Pro

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

经验法则:考虑用静态工厂方法代替公有构造方法

经验法则:考虑用静态工厂方法代替公有构造方法 一.引出静态工厂方法 对于java类而言,为了让使用者获取它自身的一个实例化对象,会有以下方法: 1.该类提供一个公有的构造方法.在这种情况下,程序可以通过多个“new 构造方法”语句来创建类的任意多个实例.但是每执行一条new语句,都会导致java虚拟机的堆区中产生一个新的对象. 2.该类提供一个公有的静态工厂方法(它只是一个简单的静态方法,返回的是类的一个实例,要区别于设计模式中的工厂方法模式).对于某些java平台库类或自己的工具类.参数化类,