//
// main.cpp
// simple_factory_pattern
//
// Created by apple on 2019/3/10.
// Copyright © 2019年 apple. All rights reserved.
//
#include <iostream>
class IProduct
{
public:
virtual void create() = 0;
};
class Error:public IProduct
{
public:
void create()
{
std::cout<<"Error"<<std::endl;
}
};
class Box:public IProduct
{
public:
void create()
{
std::cout<<"Box"<<std::endl;
}
};
class Phone:public IProduct
{
public:
void create()
{
std::cout<<"Phone"<<std::endl;
}
};
class Pen:public IProduct
{
public:
void create()
{
std::cout<<"Pen"<<std::endl;
}
};
class Factory
{
public:
Factory(){}
IProduct *GetProduct(std::string productName);
};
IProduct *Factory::GetProduct(std::string productName)
{
if (productName == "Box") {
Box *box = new Box();
return box;
}
if (productName == "Phone") {
Phone *phone = new Phone();
return phone;
}
if (productName == "Pen") {
Pen *pen = new Pen();
return pen;
}
Error *error = new Error();
return error;
}
int main(int argc, const char * argv[]) {
Factory factory;
IProduct *product;
product = factory.GetProduct("Box");
product->create();
delete product;
product = NULL;
product = factory.GetProduct("Phone");
product->create();
delete product;
product = NULL;
product = factory.GetProduct("error");
product->create();
delete product;
product = NULL;
return 0;
}
Box
Phone
Error
Program ended with exit code: 0
简单工厂模式,什么是简单工厂模式?简单工厂模式是一个简单工厂为核心,在这个工厂可以产出多种类型产品的设计模式。
在简单工厂模式中,一般需要有一个工厂类(class Factory),多个产品类(class Product1, class Product2,······),只要向工厂告知所需要的产品,工厂就会返回对应的产品。
那么如何实现简单工厂模式呢?我们可以定义一个Factory类,Factory提供有多个实例方法,或可通过向一个实例方法传递参数来选择所要生产的产品。这两种实现形式单一一种或两种同时使用都是可以的。区别在与,第一种实现形式多用于所要生产的产品是完全无关的时候可能会使用,这样就会导致耦合较多,不利于变更;第二种实现形式,多用于同一类型的各个产品之间区别不大的时候使用,这样可以使用一个公共接口,这些产品都实现公共接口,并利用接口指针使这个方法可用于这个类型的各个产品(为什么要用指针类型,因为C++不允许实例化含有纯虚函数的抽象类(所以大家才称这个为interface),故只能使用指针来利用多态)。本文中使用的是第二种方法,即向实例方法传参来选择产品,并返回一个接口指针的形式返回。
根据上一段简单工厂模式实现的介绍,简单工厂模式在需要扩展产品时时必须要修改工厂类的。当然简单工厂模式在产品确定,且以后变更的可能性极低时是很值得使用的,该设计模式简单易懂,结构清晰,主要逻辑都在工厂类中,易于统一维护。
网友评论