abstract factory pattern--抽象工厂模式

abstract factory pattern,抽象工厂模式
 
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。
Abstract Factory模式存在的意义就是为了创建各系列的对象而存在的。相对Factory Method模式的解决单个对象的需求变化,Abstract Factory模式解决系列相关对象的需求变化。明确的理解就是抽象工厂模式提供多个产品的构建。

抽象工厂(Abstract Factory):它与应用系统商业逻辑无关。

具体工厂(Concrete Factory):这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

抽象产品(Abstract Product):担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

具体产品(Concrete Product):抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。

实质:其实就是在工厂方法模式中,让工厂实现多个产品的生产,即创建多个不同的类。

举例:

由于市场份额达到一定程度,为了增长销售业绩,公司决定生产手机扩展新的业务,所以目前工厂不仅要生产汽车还要生产手机,开始做手机了。旗下有一个生产车间又生产奥迪汽车,还生产诺基亚手机,另外一个车间不仅生产奔驰汽车还生产苹果手机。
  1 #include <iostream>
  2 class Car
  3 {
  4     public:
  5         virtual void run( )=0;
  6 };
  7 
  8 class Phone
  9 {
 10     public:
 11         virtual void call( )=0;
 12 };
 13 
 14 class BenzCar:public Car
 15 {
 16     public:
 17         void run( );
 18 };
 19 void BenzCar::run( )
 20 {
 21     std::cout<<"BenzCar is running"<<std::endl;
 22 }
 23 
 24 class AudiCar:public Car
 25 {
 26     public:
 27         void run( );
 28 };
 29 void AudiCar::run( )
 30 {
 31     std::cout<<"AudiCar is running"<<std::endl;
 32 }
 33 
 34 class NokiaPhone:public Phone
 35 {
 36     public:
 37         void call( );
 38 };
 39 void NokiaPhone::call( )
 40 {
 41     std::cout<<"NokiaPhone is calling"<<std::endl;
 42 }
 43 
 44 class iPhone:public Phone
 45 {
 46       public:
 47         void call( );  
 48 };
 49 void iPhone::call( )
 50 {
 51     std::cout<<"iPhone is running"<<std::endl;
 52 } 
 53 
 54 class abstractFactory
 55 {
 56     public:
 57         virtual Car* createCar( )=0;
 58         virtual Phone* createPhone( )=0;
 59 };
 60 
 61 class AudiNokiaFactory:public abstractFactory
 62 {
 63     public:
 64         Car* createCar( );
 65         Phone*  createPhone( );
 66 };
 67 Car * AudiNokiaFactory::createCar( )
 68 {
 69     return  new AudiCar( );
 70 }
 71 Phone * AudiNokiaFactory::createPhone( )
 72 {
 73     retrun new NokiaPhone( );
 74 }
 75 
 76 class BenzIphoneFactory:public abstractFactory
 77 {
 78     public:
 79         Car* createCar( );
 80         Phone* createPhone( );
 81 };
 82 Car * BenzIphoneFactory::createCar( )
 83 {
 84         return new createCar( );
 85 }
 86 Phone * BenzIphoneFactory::createPhone( )
 87 {
 88         return new createPhone( );
 89 }
 90 
 91 void createAndTest(abstractFactory *p)
 92 {
 93     car* c=p->createCar( );
 94     c->run( );
 95     delete c;
 96     phone *ph=p->createPhone( );
 97     ph->call( );
 98     delete c;
 99 }
100 
101 int main(int argc,char ** argv )
102 {
103     abstractFactory * p1=new AudiNokiaFactory( );
104     abstractFactory * p2=new BenzIphoneFactory( );
105     createAndTest(p1);
106     createAndTest(p2);
107     delete p2;
108     delete p1;
109 }

运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Abstract Factory Pattern是一种设计模式,它是创建对象的工厂模式的变体,允许对象在运行时被替换。 Abstract Factory模式提供了一种方法,可以创建一组相关或相互依赖的对象,而不需要明确指定其具体类。 下面是一个C语言的代码示例,该代码实现了一个抽象工厂模式,该模式创建一组车辆: ```c #include <stdio.h> typedef struct IVehicle IVehicle; struct IVehicle { void (*Drive)(IVehicle *); }; typedef struct Car Car; struct Car { IVehicle base; int wheelCount; }; void Car_Drive(IVehicle *vehicle) { Car *car = (Car *)vehicle; printf("Driving a car with %d wheels\n", car->wheelCount); } typedef struct Bike Bike; struct Bike { IVehicle base; int pedalCount; }; void Bike_Drive(IVehicle *vehicle) { Bike *bike = (Bike *)vehicle; printf("Riding a bike with %d pedals\n", bike->pedalCount); } typedef struct IVehicleFactory IVehicleFactory; struct IVehicleFactory { IVehicle *(*CreateVehicle)(IVehicleFactory *); }; typedef struct CarFactory CarFactory; struct CarFactory { IVehicleFactory base; }; IVehicle *CarFactory_CreateVehicle(IVehicleFactory *factory) { Car *car = (Car *)malloc(sizeof(Car)); car->base.Drive = &Car_Drive; car->wheelCount = 4; return (IVehicle *)car; } typedef struct BikeFactory BikeFactory; struct BikeFactory { IVehicleFactory base; }; IVehicle *BikeFactory_CreateVehicle(IVehicleFactory *factory) { Bike *bike = (Bike *)malloc(sizeof(Bike)); bike->base.Drive = &Bike_Drive; bike->pedalCount = 2; return (IVehicle *)bike; } int main(int argc, char *argv[]) { CarFactory carFactory = { { &CarFactory_CreateVehicle } }; IVehicle *vehicle = carFactory.base.CreateVehicle((IVehicleFactory *)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值