您的位置:首页 > 其它

设计模式之三种工厂模式

2016-05-13 11:13 393 查看
/content/5014291.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: