设计模式(一)

设计模式(一)

简单工厂模式

在这里插入图片描述

client客户端,通过工厂类来创建对象,通过接口(抽象父类)来实现功能。
Api产品基类(抽象父类)
Factory工厂,根据输入参数来创建不同的实例对象。
Impl产品子类(用于实例化的子类)
  1. 主要实现了两个功能:
  • 定义了对象的接口——Api
  • 封装了对象的创建——Factory
  1. 代码实现
/*类的设计*/
class Api {
    virtual operation();
};
//产品A
class ImplA:public Api{
    operation(){......};
};
//产品B
class ImplB:public Api{
    operation(){......};
};
//工厂类
class Factory {
    Api* createProduct(int i){
        case 0:return new ImplA;
        case 1:return new ImplB;
    }
};
/*类的使用*/
int mian{
    Factory *fac=new Factory();	//创建工厂
    Api *implA=fac->createProduct(0);	//创建产品A
    Api *implB=fac->createProduct(1);	//创建产品B
    implA->operation();	//产品A的功能
    implB->operation();	//产品B的功能
}
  1. 分析
  • 避免使用过多的new来实例化产品子类,提高了可读性且便于维护。
  • 实现了客户端和具体实现类的解耦,让客户端能够真正的面向接口编程。

工厂模式

在这里插入图片描述

Clients客户端,通过工厂子类来创建对象,通过Product接口来实现功能
Product产品基类(抽象父类)
ImplProduct产品子类(用于实例化对象)
Factory工厂,提供创建对象的接口
ImplFactory工厂子类,用于实例化不同的产品
  1. 主要功能
  • 定义了对象的接口,封装了对象的创建
  • 使得具体化子类的工作延迟到了子类中,更容易拓展新的产品子类。
  1. 代码实现
/*类的设计*/
class Product{
    virtual operation()=0;
};
//产品A
class ImplProductA:public product{
	operation(){......};
};
//产品B
class ImplProductB:public product{
	operation(){......};
};
//工厂接口
class Factory {
	virtual CreateProduct();
};
//工厂A
class ImplFactoryA:public factory{
    CreateProduct(){
        return new ImplProductA;
    }
};
//工厂B
class ImplFactoryB:public factory{
    CreateProduct(){
        return new ImplProductB;
    }
};

/*类的使用*/
int main(){
    Factory *fac1=new ImplFactoryA();
    Factory *fac2=new ImplFactoryB();
    Product *ImplA=fac1->CreateProduct();
    Product *ImplB=fac2->CreateProduct();
    ImplA->operation();
    ImplB->operation():
}

3.分析

  • 这种模式下,增加新的产品只需要增加新的工厂子类和新的产品子类。对原有的体系没有冲击。
  • 这是“依赖倒置原则”的体现:要依赖抽象,不要依赖具类

抽象工厂模式

在这里插入图片描述

  1. 主要功能
  • 为创建一组(有多类)相关或依赖的对象提供创建接口。
  • 着重于产品簇的实现
  1. 代码
/*类的设计*/
class AbstractProductA{
	virtual operation1();
};
//产品A1
class ImplProductA1:public AbstractProductA {
	operation1(){......};
};
//产品A2
class ImplProductA2:public AbstractProductA {
	operation1(){......};
};

class AbstractProductB{
    virtual operation2();
};
//产品B1
class ImplProductB1:public AbstractProductB {
	operation2(){......};
};
//产品B2
class ImplProductB2:public AbstractProductB {
	operation2(){......};
};

class AbstractFactory{
    virtual CreateProductA();
    virtual CreateProductB();
};
class ImplFactory1:public AbstractFactory {
    CreateProductA();
    CreateProductB();
};
class ImplFactory2:public AbstractFactory {
    CreateProductA();
    CreateProductB();
};
/*类的使用*/
int main(){
	AbstractFactory *fac1=new ImplFactory1();
    AbstractFactory *fac2=new ImplFactory2();
    AbstractProduct *A1=fac1->CreateProductA();
    AbstractProduct *B1=fac1->CreateProductB();
    AbstractProduct *A2=fac1->CreateProductA();
    AbstractProduct *B2=fac1->CreateProductB();
    A1->operation1();
    B1->operation2();
    A2->operation1();
    B2->operation2();	
}

  1. 分析
  • 当只有一种产品基类时,抽象工厂模式退化为工厂模式。

总结

​ 上述三种设计模式其基本功能都是定义了对象的接口,封装了对象的实现。尽可能的保证客户端代码的实现依赖于抽象而不是具体实现。

简单工厂模式: 在单个的工厂类里面:通过不同参数(或者重载,或者模板参数)来实例化不同的产品子类。

工厂模式: 定义抽象工厂,根据不同的子类工厂来实例化不同的产品子类。

抽象工厂模式: 对应于产品簇的实现,一大特征就是有着大于1的产品基类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值