• 设计模式:工厂方法模式


    抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品的生产,抽象工厂更注重产品的组合。

    设计原则:遵循单一职责、依赖倒置、开闭原则
    常用场景:需要一个接口可以提供一个产品族,且不必知道产品的具体种类
    变化点:工厂与产品的种类
    选择关键点:产品族是否需要一起提供,且是否有一致的接口

    假如我们需要各种水果(如apple),那么做法是:

    1.首先需要一个苹果工厂类,从抽象工厂类继承;

    2.来一个苹果,苹果工厂只能生产苹果(苹果工厂的生产器只能生产苹果)。

    抽象工厂模式结构图:

    实现代码:

     1 #include<iostream>
     2 //工厂方法模式
     3 using namespace std;
     4 class Fruit {
     5 public:
     6     virtual void getName() = 0;
     7 };
     8 
     9 class Apple :public Fruit {
    10     virtual void getName(){
    11         cout << "I'am apple." << endl;
    12     }
    13 };
    14 
    15 class Banana :public Fruit {
    16     virtual void getName() {
    17         cout << "Banana." << endl;
    18     }
    19 };
    20 
    21 class AbstractFactory {
    22 public:
    23     virtual Fruit* CreateFruit() = 0;
    24 };
    25 
    26 class AppleFactory :public AbstractFactory {
    27 public:
    28     virtual Fruit* CreateFruit() {
    29         return new Apple;
    30     }
    31 };
    32 
    33 class BananaFactory :public AbstractFactory {
    34 public:
    35     virtual Fruit* CreateFruit() {
    36         return new Banana;
    37     }
    38 };
    39 
    40 int main(void)
    41 {    
    42     AbstractFactory* af = new AppleFactory;
    43     Fruit * apple = af->CreateFruit();
    44     apple->getName();
    45     delete af;
    46     delete apple;
    47 
    48     AbstractFactory* bf = new BananaFactory;
    49     Fruit * banana = bf->CreateFruit();
    50     banana->getName();
    51     delete bf;
    52     delete banana;
    53 
    54     return 0;
    55 }

     测试结果:

  • 相关阅读:
    boke
    Http post/get
    记一次网站优化---图片压缩与移动端画面缩放问题
    深入浅出 Vue.js 第九章 解析器---学习笔记
    Linux/Mac中alias的使用
    JavaScript中的函数柯里化与反柯里化
    JavaScript中深拷贝实现
    JavaScript中的节流和防抖
    博客园加入百度统计遇到的坑
    记一次无数据库下动态更新文案的解决历程
  • 原文地址:https://www.cnblogs.com/Burgess-Fan/p/6752045.html
Copyright © 2020-2023  润新知