- 浏览: 768945 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
抽象工厂模式:提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。这样客户就可以从具体的产品中被解耦.
要点:
1.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中
2.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类
关于简单工厂,工厂,抽象工厂的区别,从网上找到一个比较好的实例:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
Pizza.h
PizzaStore.h
PizzaIngredientFactory.h
main.cpp
另一份代码:
SimpleFactory.h
FactoryMethod.h
AbstractFactory.h
main.cpp
要点:
1.抽象工厂使用对象组合:对象的创建被实现在工厂接口所暴露出来的方法中
2.抽象工厂创建相关的对象家族,而不需要依赖它们的具体类
关于简单工厂,工厂,抽象工厂的区别,从网上找到一个比较好的实例:
1.如果一个后花园只种蔬菜类,那么就用简单工厂就可以了.
2.如果后花园蔬菜品种繁多.得用工厂方法才可以,把共有的东西抽象出来.
3.如果要扩大后花园的规模,比如一个在北方,一个在南方,这样工厂方法就无法实现了,就应当用抽象工厂,把各种各样的植物,又组成一个后花园.
简单工厂是一个工厂只生产一类的产品,面对的是具体的类,工厂方法是可以生产不同的产品,把公共的方法抽象出来,然后进行创建各种各样的产品.抽象工厂把几种产品划出共同的东西,把相互依赖的对象抽象出来,只要实现这些接口就可以得到不同的产品.
Pizza.h
#ifndef PIZZA_H #define PIZZA_H #include"iostream" #include"PizzaIngredientFactory.h" using namespace std; class Pizza{ public: explicit Pizza(PizzaIngredientFactory* pif){ mPif = pif; } virtual void prepare(){ cout << "prepare..." << endl; } virtual void bake(){ cout << "bake..." << endl; } virtual void cut(){ cout << "cut..." << endl; } virtual void box(){ cout << "box..." << endl; } private: PizzaIngredientFactory* mPif; }; class CheesePizza:public Pizza{ public: explicit CheesePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){ mPif->createDough(); mPif->createClam(); cout << "this is a CheesePizza" << endl; } private: PizzaIngredientFactory* mPif; }; class VeggiePizza:public Pizza{ public: explicit VeggiePizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){ mPif->createPepperoni(); mPif->createClam(); cout << "this is a CheesePizza" << endl; } private: PizzaIngredientFactory* mPif; }; class ClamPizza:public Pizza{ public: explicit ClamPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){ mPif->createDough(); mPif->createVeggies(); cout << "this is a CheesePizza" << endl; } private: PizzaIngredientFactory* mPif; }; class PepperonPizza:public Pizza{ public: explicit PepperonPizza(PizzaIngredientFactory* pif):Pizza(pif),mPif(pif){ mPif->createPepperoni(); mPif->createSauce(); cout << "this is a CheesePizza" << endl; } private: PizzaIngredientFactory* mPif; }; #endif // PIZZA_H
PizzaStore.h
#ifndef PIZZASTORE_H #define PIZZASTORE_H #include"Pizza.h" enum PizzaType{ CHEESEPIZZA, VEGGIEPIZZA, CLAMPIZZA, PEPPERONIPIZZA }; class PizzaStore{ public: explicit PizzaStore(){ } void orderPizza(PizzaType pt){ Pizza *pizza; pizza = createPizza(pt); pizza->prepare(); pizza->bake(); pizza->cut(); pizza->box(); } virtual Pizza* createPizza(PizzaType pt)=0; }; class NYPizzaStore:public PizzaStore{ public: NYPizzaStore(){ mPif = new NYPizzaIngredientFactory; } void orderPizza(PizzaType pt){ Pizza *pizza; pizza = createPizza(pt); pizza->prepare(); pizza->bake(); pizza->cut(); pizza->box(); } Pizza* createPizza(PizzaType pt){ switch(pt){ case CHEESEPIZZA: return new CheesePizza(mPif); break; case VEGGIEPIZZA: return new VeggiePizza(mPif); break; case CLAMPIZZA: return new ClamPizza(mPif); break; case PEPPERONIPIZZA: return new PepperonPizza(mPif); break; default: return NULL; break; } } private: PizzaIngredientFactory* mPif; }; #endif // PIZZASTORE_H
PizzaIngredientFactory.h
#ifndef PIZZAINGREDIENTFACTORY_H #define PIZZAINGREDIENTFACTORY_H #include<iostream> using namespace std; //生面团 class Dough{}; //果酱 class Sauce{}; //蔬菜 class Veggies{}; //意大利辣味香肠 class Pepperoni{}; //蛤蜊 class Clam{}; //原料工厂 class PizzaIngredientFactory{ public: virtual void createDough()=0; virtual void createSauce()=0; virtual void createVeggies()=0; virtual void createPepperoni()=0; virtual void createClam()=0; }; class NYPizzaIngredientFactory:public PizzaIngredientFactory{ public: void createDough(){ cout << "create dough.." << endl; } void createSauce(){ cout << "create sauce.." << endl; } void createVeggies(){ cout << "create veggies.." << endl; } void createPepperoni(){ cout << "create popperoni.." << endl; } void createClam(){ cout << "create clam.." << endl; } }; #endif // PIZZAINGREDIENTFACTORY_H
main.cpp
#include"PizzaStore.h" int main(){ PizzaStore *store = new NYPizzaStore(); store->orderPizza(CHEESEPIZZA); } create dough.. create clam.. this is a CheesePizza prepare... bake... cut... box...
另一份代码:
SimpleFactory.h
#ifndef SIMPLEFACTORY_H #define SIMPLEFACTORY_H class Fruit { }; class Apple:public Fruit { }; class Pear:public Fruit { }; class Orange:public Fruit { }; enum FRUIT_TYPE { APPLE, PEAR, ORANGE }; class Land { public: Land() { mApple = new Apple; mPear = new Pear; mOrange = new Orange; } ~Land(){} Fruit* create(int fruitType) { switch(fruitType) { case APPLE: return mApple; case PEAR: return mPear; case ORANGE: return mOrange; default: return 0; } } private: Apple* mApple; Pear* mPear; Orange* mOrange; }; #endif // SIMPLEFACTORY_H
FactoryMethod.h
#ifndef FACTORYMETHOD_H #define FACTORYMETHOD_H namespace FactoryMethod { class Fruit{}; class Apple:public Fruit{}; class Apple1:public Apple{}; class Apple2:public Apple{}; class Apple3:public Apple{}; class Land { public: virtual Fruit* create()=0; }; class AppleLand:public Land { public: AppleLand() { mApple = new Apple; } ~AppleLand(){} Fruit* create() { return mApple; } private: Apple* mApple; }; }//end of namespace FactoryMethod #endif // FACTORYMETHOD_H
AbstractFactory.h
#ifndef ABSTRACTFACTORY_H #define ABSTRACTFACTORY_H namespace AbstractFactory { class Fruit{}; class Apple:public Fruit{}; class Apple1:public Apple{}; class Apple2:public Apple{}; class Apple3:public Apple{}; class Land { public: virtual Fruit* createType1()=0; virtual Fruit* createType2()=0; virtual Fruit* createType3()=0; }; class Apple1Land:public Land { public: Apple1Land() { mApple1 = new Apple1; mApple2 = new Apple2; mApple3 = new Apple3; } ~Apple1Land(){} Fruit* createType1(){ return mApple1; } Fruit* createType2(){ return mApple2; } Fruit* createType3(){ return mApple3; } private: Apple* mApple1; Apple* mApple2; Apple* mApple3; }; }//end of namespace AbstractFactory #endif // ABSTRACTFACTORY_H
main.cpp
#include "SimpleFactory.h" #include "FactoryMethod.h" #include "AbstractFactory.h" int main() { Land* land = new Land; land->create(APPLE); FactoryMethod::Land* appleLand = new FactoryMethod::AppleLand; appleLand->create(); AbstractFactory::Land* apple1Land = new AbstractFactory::Apple1Land; apple1Land->createType1(); }
发表评论
-
桥接模式(Bridge)
2014-09-26 15:34 819桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 837访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 679解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 636享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 444中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 586职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 589合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 432组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 561备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 596委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 566建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 632外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 407迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 512原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 339里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 396依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 563开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 561单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
MVC
2011-07-21 17:32 1015MVC是一种复合模式,结合了观察者,策略模式和组合模式。 要 ... -
代理模式(Proxy)
2011-07-19 15:47 930代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ...
相关推荐
抽象工厂(Abstract Factory)模式是一种创建型设计模式,它提供了一种创建对象的接口,但允许子类决定实例化哪一个类。这种模式是基于对象的抽象,而不是具体的类,因此,它允许创建一系列相关的对象,而无需指定...
这个压缩包“C# 抽象工厂 AbstractFactory.rar”可能包含了一个关于如何在C#中实现抽象工厂模式的实例或教程。 抽象工厂模式是一种创建型设计模式,它提供了一种创建对象族的方式,而无需指定具体类。在C#中,这种...
1. **模式结构**:抽象工厂模式通常包括抽象工厂接口(AbstractFactory),具体工厂类(ConcreteFactory),抽象产品接口(Product)以及具体产品类(ConcreteProduct)。抽象工厂定义了创建产品的方法,而具体工厂...
Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂Abstract_Factory抽象工厂
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象集合的接口,而无需指定具体的产品类型。这种模式适用于当系统需要在不同平台或环境中创建一组相关或相互依赖的对象时,而这些...
在软件设计模式中,工厂方法(Factory Method)和抽象工厂(Abstract Factory)是两种非常重要的创建型模式。它们主要用于解决对象实例化的问题,提供了一种封装对象创建过程的方法,使得代码更加灵活,易于扩展和...
1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...
抽象工厂(Abstract Factory)模式是设计模式中的一种创建型模式,它提供了一种...在阅读提供的博客文章《AbstractFactory 抽象工厂》和研究压缩包中的相关文件时,你可以深入学习到更多关于这个模式的实践和应用场景。
在这个例子中,`AbstractProductA`和`AbstractProductB`是抽象产品,`ConcreteProductA1/A2`和`ConcreteProductB1/B2`是具体产品,`AbstractFactory`是抽象工厂,`ConcreteFactory1/2`是具体工厂。客户端代码通过...
抽象工厂(Abstract Factory)设计模式是软件工程中一种重要的创建型设计模式,它提供了一种创建对象组的方式,这些对象属于同一族系并且彼此相关。这个模式的主要目标是定义一个接口,用于创建一族相关或相互依赖的...
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...
1. 抽象工厂(Abstract Factory):这是模式的核心,定义了一组创建对象的接口,客户端通过这个接口请求创建所需的产品。这个接口不直接创建产品,而是将产品创建的职责委托给具体工厂。 2. 具体工厂(Concrete ...
### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...
1. **抽象工厂接口(Abstract Factory)**:定义了一系列产品的创建方法,例如`NWFactory`可能是这个抽象工厂的实现,它包含了创建人和动物的方法。 2. **具体工厂类(Concrete Factory)**:实现了抽象工厂接口,...
设计模式抽象工厂模式(AbstractFactory)源代码
在C#中实现抽象工厂模式(Abstract Factory Pattern)涉及定义一个抽象工厂接口,该接口声明用于创建抽象产品的方法。然后,为每个具体产品族实现一个具体工厂,这些工厂提供创建具体产品的实现。最后,客户端代码...
在“AbstractFactory.rar”这个压缩包中,我们可以预想包含了一个简单的示例,用来演示抽象工厂模式的基本概念和应用。 抽象工厂模式的核心在于“工厂”,在软件工程中,工厂是负责创建对象的类或接口。在这个具体...
### C#设计模式之抽象工厂(Abstract Factory)模式详解 #### 概述 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的一种,它提供了一个接口用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的...
在给定的压缩包文件中,"AbstractFactory"可能包含了一些示例代码或者实现,用来解释抽象工厂模式的具体应用。这些代码可能包括抽象工厂接口、具体工厂类以及抽象产品和具体产品的定义。通过查看这些代码,我们可以...
生产餐具和相应食物的工厂,有两个车间,其中一个车间用以生产餐具,一个车间用以生产相应的食物。 每个具体工厂生产出来的具体产品根据不同工厂的不同各不相同,但是客户使用产品的方法是一致的。比如客户在得到...