码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之工厂模式

时间:2014-08-24 23:26:33      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:blog   os   使用   io   ar   div   log   amp   工作   

一、简介
  工厂模式属于创建型模式,大致上可以分三类:
  1)、简单工厂模式(Simple Factory)
  2)、工厂方法模式(Simple Factory)
  3)、抽象工厂模式(Simple Factory)
  这三种模式是逐步抽象,并且更具一般性。另有一种分法就是将简单工厂模式看作是工厂方法的一种特例,归为一类模式。如下是使用工厂模式的情况:
  1.在编码时不能预见需要创建哪种类的实例
  2.系统不应依赖于产品类实例如何被创建、组合和表达的细节,对于使用者来说是透明的

二、目标
  目标:提高内聚(Cohesion)和松耦合(Coupling)
  最重要的功能:
  1)、定义创建对象的接口,封装了对象的创建;
  2)、使得具体化类的工作延迟到了子类中

三、实现

简单工厂

enum CTYPE {PRODUCT_A, {PRODUCT_B};   
class Product  
{  
public:  
    virtual void Display() = 0;
};  
  
class ProductA: public Product
{  
public:  
    void Display() { cout<<"Display A"<<endl; }  
};  

class ProductB: public Product    
{  
public:  
    void Display() { cout<<"Display B"<<endl; }  
};  
 
class Factory  
{  
public:   
    Product* CreateProduct(enum CTYPE ctype)  
    {  
        if(ctype == PRODUCT_A) 
            return new ProductA();  
        else if(ctype == PRODUCT_B)  
            return new ProductB(); 
        else  
            return NULL;  
    }  
};

工厂方法

enum CTYPE {PRODUCT_A, {PRODUCT_B};   
class Product  
{  
public:  
    virtual void Display() = 0;
};  
  
class ProductA: public Product
{  
public:  
    void Display() { cout<<"Display A"<<endl; }  
};  

class ProductB: public Product    
{  
public:  
    void Display() { cout<<"Display B"<<endl; }  
}; 

class Factory    
{    
public:    
    virtual Product* CreateProduct() = 0;  
};    
  
class FactoryA: public Factory    
{    
public:    
    ProductA* CreateProduct() { return new ProductA; }    
};    
  
class FactoryB: public Factory    
{    
public:    
    ProductB* CreateProduct() { return new ProductB; }    
}; 

抽象工厂

enum CTYPE {PRODUCT_A, {PRODUCT_B};   
class Product  
{  
public:  
    virtual void Display() = 0;
};  
  
class ProductA: public Product
{  
public:  
    void Display() { cout<<"Display A"<<endl; }  
};  

class ProductB: public Product    
{  
public:  
    void Display() { cout<<"Display B"<<endl; }  
}; 

 
class MultiProduct  
{  
public:  
    virtual void Display() = 0;
};  
class MultiProductA : public MultiProduct  
{  
public:  
    void Display() { cout<<"Multi Product A"<<endl; }  
  
};  
class MultiProductB : public MultiProduct  
{  
public:  
    void Display() { cout<<"Multi Product B"<<endl; }  
};  

class Factory    
{  
public:  
    virtual Product* CreateProduct() = 0;
    virtual MultiProduct* CreateMultiProduct() = 0;
};  
 
class FactoryA :public Factory    
{  
public:  
    Product* CreateProduct() { return new ProductA(); }  
    MultiProduct* CreateMultiProduct() { return new MultiProductA(); }  
};  

class FactoryB : public Factory    
{  
public:  
    Product* CreateProduct() { return new ProductB(); }  
    MultiProduct* CreateMultiProduct() { return new MultiProductB (); }  
}; 

如下是本人用模板实现的通用的性工厂模式:(推荐大家采用本实现)

#ifndef CRREATEFACTORY_H
#define CRREATEFACTORY_H

#include <map>
#include <string>

template<typename Product, typename ConcreteProduct>
class ConcreteCreator
{
public:
	static Product* CreateConcreteProduct()
	{
		return new ConcreteProduct();
	}
};

template<typename Product>
class CreatorFactory
{
public:
	static CreatorFactory& Instance()
	{
		static CreatorFactory<Product> instance;
		return instance;
	}

public:
	typedef Product* (*CreateProductDelegate)();
	typedef std::map<std::string, CreateProductDelegate> MapFactories;

	template<typename ConcreteProduct>
	void RegisterFactory(const std::string& factoryName)
	{
		m_factories[factoryName] = ConcreteCreator<Product, ConcreteProduct>::CreateConcreteProduct;
	}

	void UnregisterFactory(const std::string& factoryName)
	{
		if(m_factories.size() > 0)
		{
			MapFactories::iterator it = m_factories.find(factoryName);
			if(it != m_factories.end())
			{
				m_factories.erase(it);
			}
		}
	}

	void UnregisterFactories()
	{
		m_factories.clear();
	}

	Product* CreateProduct(const std::string& factoryName)
	{
		MapFactories::iterator type = m_factories.find(factoryName);
		if (type != m_factories.end())
		{
			CreateProductDelegate create = type->second;
			if (create != 0)
				return create();
		}
		return 0;
	}

	void ReleaseProduct(Product** product)
	{
		if(*product)
		{
			Product* p = *product;
			*product = 0;

			delete p;
			p = 0;
		}
	}

private:
	CreatorFactory() {}
	~CreatorFactory() {}
	CreatorFactory(const CreatorFactory&);
	CreatorFactory& operator=(const CreatorFactory&);

private:
	MapFactories m_factories;
};
#endif//CRREATEFACTORY_H


#include <stdio.h>

#include<iostream>  
#include<string>  
#include <limits>

#include "CreatorFactory.h"

using namespace std;

class CBase
{
public:
};

class Person : public CBase
{
public:
};

class Age : public CBase
{
public:
};

class Gender : public CBase
{
public:
};

#include <string.h>
#include <typeinfo.h>
#include <stdio.h>

class Base
{
public:
	Base()
	{
		strcpy(name,"Base");
	}

	virtual void display()
	{
		cout<<"Display Base."<<endl;
	}

	virtual void printName()
	{
		printf("printf base\n");
	}

protected:
	char name[64];
};

class Child1:public Base
{
public:
	Child1()
	{
		strcpy(name,"Child1");
	}

	void display()
	{
		cout<<"Display Child1."<<endl;
	}

	virtual void printName()
	{
		Base::printName();
		printf("printf Child1\n");
	}
};

class Child2:public Base
{
public:
	Child2()
	{
		strcpy(name,"Child2");
	}

	void display()
	{
		cout<<"Display Child2."<<endl;
	}

	virtual void printName()
	{
		Base::printName();
		printf("printf Child2\n");
	}
};

void Process(Base *type)
{
	if( (typeid(Child1)) == (typeid(*type)) )
	{
		((Child1*)type)->display();
		printf("Process name = %s\n", typeid(*type).name());
	}
	else if( (typeid(Child2)) == (typeid(*type)) )
	{
		((Child2*)type)->display();
		printf("Process name = %s\n", typeid(*type).name());
	}
	else
	{
		cout<<"Unknow type!"<<endl;
	}
}

int main()
{
	cout << "bool: \t\t" << "所占字节数:" << sizeof(bool) << endl;  
	int max = (numeric_limits<bool>::max)();
	int min = (numeric_limits<bool>::min)();
	
	typedef CreatorFactory<CBase> PersonFactory;  
	PersonFactory& factory = PersonFactory::Instance();  
	factory.RegisterFactory<Person>("Person");  
	factory.RegisterFactory<Age>("Age");  
	factory.RegisterFactory<Gender>("Gender");  

	CBase* person = factory.CreateProduct("Person");
	CBase* age = factory.CreateProduct("Age");
	CBase* gender = factory.CreateProduct("Gender");

	factory.UnregisterFactory("Age");
	factory.ReleaseProduct(&age);
	factory.UnregisterFactory("Henry");

	Base *pT1 = new Child1();
	Base *pT2 = new Child2();
	
	Process(pT1);
	Process(pT2);

	pT1->printName();
	pT2->printName();

	printf("OK/n");

	getchar();
	return 0;
}

设计模式之工厂模式

标签:blog   os   使用   io   ar   div   log   amp   工作   

原文地址:http://www.cnblogs.com/wenrenhua08/p/3933631.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!