设计模式之三种工厂模式

http://www.cnblogs.com/cxjchen/p/3143633.html

1.简单工厂模式

特点:简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到底是返回了哪个子类。每次添加一个产品子类都必须在工厂类中添加一个判断分支,但违背开放-封闭原则

角色:

抽象工厂类

抽象产品类

具体产品类

class Fruit{
public:
	virtual void GetFruit()=0;
};

class Apple:public Fruit{
public:
	void GetFruit(){
		cout<<"produce apples"<<endl;
	}

};
class Pear:public Fruit{
public:
	void GetFruit(){
		cout<<"produce pears"<<endl;
	}

};

class FruitFactory{
public:
	Fruit* CreateFruit(char* p){
		if(strcmp(p,"apple")==0)
		return new Apple;
		else 
		if(strcmp(p,"pear")==0)
			return new Pear;
		else{
			cout<<"NO"<<endl;
			return NULL;
		}
	}

};
int main(){
	FruitFactory* factory=new FruitFactory;
	Fruit* p=factory->CreateFruit("apple");
	p->GetFruit();
	delete p;
	p=factory->CreateFruit("pear");
	p->GetFruit();
	delete p;
	return 0;
}

2.工厂模式

特点:

每当生产一个产品时,先创建一个生产此产品的工厂。

角色:

抽象工厂类

具体工厂类

抽象产品类

具体产品类

class Fruit{
public:
	virtual void GetFruit()=0;
};

class Apple:public Fruit{
public:
	void GetFruit(){
		cout<<"produce apples"<<endl;
	}

};
class Pear:public Fruit{
public:
	void GetFruit(){
		cout<<"produce pears"<<endl;
	}

};
class FruitFactory{
public:
	virtual Fruit* CreateFruit()=0;
};
class AppleFactory:public FruitFactory{
	Fruit* CreateFruit(){
		return new Apple;
	}
};
class PearFactory:public FruitFactory{
	Fruit* CreateFruit(){
		return new Pear;
	}
};

int main(){
	FruitFactory* factory=NULL;
	Fruit* p=NULL;
	factory=new AppleFactory;
	p=factory->CreateFruit();
	p->GetFruit();
	delete factory;
	delete p;
	factory=new PearFactory;
	p=factory->CreateFruit();
	p->GetFruit();
	delete factory;
	delete p;
	return 0;
}

3.抽象工厂模式

特点:工厂模式只能生产一个产品(要么苹果,要么香蕉),而抽象工厂可以一下生产一个产品族(由好多产品构成)。

角色:

抽象工厂类,其核心是包含一个产品族的相关接口。

具体工厂类

抽象产品类

具体产品类

//抽象水果
class Fruit{
public:
	virtual void GetFruit()=0;
};
//北方产品族--------------------------------------------
class NorthApple:public Fruit{
public:
	void GetFruit(){
		cout<<"produce Northapples"<<endl;
	}

};
class NorthPear:public Fruit{
public:
	void GetFruit(){
		cout<<"produce Northpears"<<endl;
	}

};
//南方产品族----------------------------------------------------
class SouthApple:public Fruit{
public:
	void GetFruit(){
		cout<<"produce Southapples"<<endl;
	}

};
class SouthPear:public Fruit{
public:
	void GetFruit(){
		cout<<"produce Southpears"<<endl;
	}

};
//抽象工厂
class FruitFactory{
public:
	virtual Fruit* CreateApple()=0;
	virtual Fruit* CreatePear()=0;
};
//北方工厂-------------------------------------------------------
class NorthFruitFactory : public FruitFactory{
public:
	Fruit* CreateApple(){
		return new NorthApple;
	}
	Fruit* CreatePear(){
		return new NorthPear;
	}
};
//南方工厂----------------------------------------------------------
class SouthFruitFactory : public FruitFactory{
public:
	Fruit* CreateApple(){
		return new SouthApple;
	}
	Fruit* CreatePear(){
		return new SouthPear;
	}
};

int main(){
	Fruit* f=NULL;
	FruitFactory* factory=NULL;
	//生产北方产品族-----------------------------------------------------------
	factory=new NorthFruitFactory;
	f=factory->CreateApple();
	f->GetFruit();
	delete f;
	f=factory->CreatePear();
	f->GetFruit();
	delete f;
	delete factory;
	//生产南方产品族--------------------------------------------------------------
	factory=new SouthFruitFactory;
	f=factory->CreateApple();
	f->GetFruit();
	delete f;
	f=factory->CreatePear();
	f->GetFruit();
	delete f;
	delete factory;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值