Factory
引出:为了提高内聚 和 松 耦合 ,我们经常会抽象出一些类的公共接口以形成抽象基类或者接口
通过声明一个指向基类的指针来指向实际的子类达到多态的目的。 问题:多子类继承抽象基类
我们需要new XXX来用到子类 。
- 1. 客户程序员想使用必须知道子类的名字( 系统复杂 可能冲突 可记忆性差等问题 (程序的扩展性和维护变得越来越困难
- 2. 父类不知道要实例化哪个具体子类。
Factory 模式的两个最重要的功能:
- 1)定义创建对象的接口,封装了对象的创建;
- 2)使得具体化类的工作延迟到了子类中
声明一个创建对象的接口,并封装了对象的创建过程。
提供一个对象创建对象的接口,并在子类中提供其具体实现
#include"Factory.h" #include"Product.h" #include<iostream> using namespace std; int main() { Factory *fact = new ConcreteFactory; Product *p = fact->createProduct(); system("pause"); return 0; }
#include "Factory.h" Factory::Factory() { } Factory::~Factory() { } ConcreteFactory::ConcreteFactory() { cout << "ConcreteFactory" << endl; } ConcreteFactory::~ConcreteFactory() { } Product * ConcreteFactory::createProduct() { return new ConcreteProduct; }
#ifndef FACTORY_H #define FACTORY_H #include"Product.h" #include<iostream> using namespace std; class Factory { public: Factory(); virtual Product* createProduct() = 0; ~Factory(); }; class ConcreteFactory:public Factory { public: ConcreteFactory(); ~ConcreteFactory(); Product* createProduct(); private: }; #endif // !FACTORY_H
#ifndef PRODUCT_H #define PRODUCT_H class Product { public: Product(); virtual~Product() = 0; }; class ConcreteProduct:public Product { public: ConcreteProduct(); ~ConcreteProduct(); private: }; #endif // !PRODUCT_H
#include "Product.h" #include<iostream> using namespace std; Product::Product() { } Product::~Product() { } ConcreteProduct::ConcreteProduct() { cout << "ConcreteProduct" << endl; } ConcreteProduct::~ConcreteProduct() { }
局限:不符合开闭原则