//
// main.cpp
// abstract_factory_pattern
//
// Created by apple on 2019/3/10.
// Copyright © 2019年 apple. All rights reserved.
//
#include <iostream>
class IProduct
{
public:
virtual void create() = 0;
virtual ~IProduct() {}
};
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 IFactory
{
public:
virtual IProduct *GetProductBox() = 0;
virtual IProduct *GetProductPen() = 0;
virtual ~IFactory() {}
};
class IAnotherFactory
{
public:
virtual IProduct *GetProduct_by_new_methodBox() = 0;
virtual IProduct *GetProduct_by_new_methodPhone() = 0;
};
class FactoryA:public IFactory
{
public:
IProduct *GetProductBox();
IProduct *GetProductPen();
};
class FactoryB:public IFactory,public IAnotherFactory
{
public:
IProduct *GetProductBox();
IProduct *GetProductPen();
IProduct *GetProduct_by_new_methodBox();
IProduct *GetProduct_by_new_methodPhone();
};
IProduct *FactoryA::GetProductBox()
{
return new Box();
}
IProduct *FactoryA::GetProductPen()
{
return new Pen();
}
IProduct *FactoryB::GetProductBox()
{
return new Box();
}
IProduct *FactoryB::GetProductPen()
{
return new Pen();
}
IProduct *FactoryB::GetProduct_by_new_methodBox()
{
return new Box();
}
IProduct *FactoryB::GetProduct_by_new_methodPhone()
{
return new Phone();
}
int main(int argc, const char * argv[]) {
IProduct *product;
IFactory *factory;
factory= new FactoryA();
product = factory->GetProductBox();
product->create();
delete product;
product = NULL;
product = factory->GetProductPen();
product->create();
delete product;
product = NULL;
delete factory;
factory = NULL;
factory = new FactoryB();
product = factory->GetProductBox();
product->create();
delete product;
product = NULL;
product = factory->GetProductPen();
product->create();
delete product;
product = NULL;
product = ((FactoryB *)factory)->GetProduct_by_new_methodBox();
product->create();
delete product;
product = NULL;
product = ((FactoryB *)factory)->GetProduct_by_new_methodPhone();
product->create();
delete product;
product = NULL;
delete factory;
factory = NULL;
return 0;
}
Box
Pen
Box
Pen
Box
Phone
Program ended with exit code: 0