首页 > 其他分享 >工厂模式、工厂方法面试常备

工厂模式、工厂方法面试常备

时间:2024-09-03 18:23:42浏览次数:5  
标签:name creat Car Factory 常备 面试 car new 工厂

1、定义汽车

#include <iostream>
using namespace std;

class Car {
    public:
    Car(string name_):name(name_){}
    ~Car(){}
    public:
    string name;
    virtual void show() {
        cout<<"this is nomore:"<<name<<endl;
    };
};

class BMW :public Car {
    public:
    BMW(string name1):Car(name1){}
    ~BMW(){}
    virtual void show() {
        cout<<"this is a BMW:"<<name<< endl;
    }
};

class BANZ:public Car {
    public:
    BANZ(string name2):Car(name2){}
    ~BANZ(){}
    virtual void show() {
        cout<<"this is a BANZ:"<<name<<endl;
    }
};

2、定义工厂

#include "car.hpp"
//工厂模式(函数版)
class Factory {
    public:
    Car* produce_bmw();
    Car* produce_banz();
    Factory(){}
    ~Factory(){}
};

Car* Factory::produce_bmw() {
    return new BMW("520i");
}
Car* Factory::produce_banz() {
    return new BANZ("E350");
}

enum cartype {
    BMW_,
    BANZ_,
    UNKNOW
};
//工厂模式(枚举版)
class Factory_1 {
    public:
    Factory_1(){}
    ~Factory_1(){}
    Car* creat_car(cartype name);
};

Car* Factory_1::creat_car(cartype name) {
    switch (name)  {
        case BMW_:
            return new BMW("730i");
        case BANZ_:
            return new BANZ("S600");
        default:
            return new Car("car");
    }
};
//工厂方法
//工厂继承的方式,避免修改代码,只增加继承类。
class Factory_base {
    public:
    Factory_base(){}
    ~Factory_base(){}
    virtual Car* creat_car(string name) {
        return new Car(name);
    }
};

class BMWFactory:public Factory_base {
    public:
    BMWFactory():Factory_base(){}
    ~BMWFactory(){}
    virtual Car* creat_car(string name);
};

class BANZFactory :public Factory_base {
    public:
    BANZFactory():Factory_base(){}
    ~BANZFactory(){}
    virtual Car* creat_car(string name);
};

Car* BMWFactory::creat_car(string name) {
    return new BMW(name);
}

Car* BANZFactory::creat_car(string name) {
    return new BANZ(name);
}

3、开始制造

#include <iostream>
#include "factory.hpp"
#include <memory>
using namespace std;


int main() {
    // //作坊生产汽车:零件都摊在上,谈好价钱现窜
    // Car* car = new Car("nihao");
    // car->show();
    // Car* banz = new BANZ("E350");
    // banz->show();
    // Car* bmw = new BMW("520i");
    // bmw->show();
    // delete banz;
    // delete bmw;
    // delete car;

    // // 工厂模式(指针版):用工厂生产。
    // // 缺点:工厂要适配不同汽车
    // // 特点:函数确认生产的类型
    // Factory* fac = new Factory();
    // Car* banz = fac->produce_banz();
    // Car* bmw = fac->produce_bmw();
    // banz->show();
    // bmw->show();
    // delete fac;
    // delete banz;
    // delete bmw;

    // // 工厂模式(指针版):用工厂生产。
    // // 缺点:工厂要适配不同汽车
    // // 特点:枚举确认生产类型
    // Factory_1* fac = new Factory_1();
    // Car* bmw = fac->creat_car(BMW_);
    // bmw->show();
    // Car* banz = fac->creat_car(BANZ_);
    // banz->show();
    // Car* car = fac->creat_car(UNKNOW);
    // car->show();
    // delete bmw;
    // delete banz;
    // delete car;
    // delete fac;

    // // 工厂模式(智能指针版):用工厂生产。
    // // 缺点:工厂要适配不同汽车
    // // 特点:枚举确认生产类型
    // unique_ptr<Factory_1> fac(new Factory_1());
    // unique_ptr<Car> bmw(fac->creat_car(BMW_));
    // unique_ptr<Car> banz(fac->creat_car(BANZ_));
    // bmw->show();
    // banz->show();

    // // 工厂方法(智能指针版):创造专有工厂。
    // // 缺点:需要建专有工厂,成本高。
    // // 特点:建专有工厂 专场专用,不需要修改代码,只需要继承子工厂就行了
    // // 创建专有工厂
    // unique_ptr<Factory_base> bmwfac(new BMWFactory());
    // unique_ptr<Factory_base> banzfac(new BANZFactory());
    // unique_ptr<Factory_base> carfac(new Factory_base());
    // //用工厂生产
    // unique_ptr<Car> bmwcar(bmwfac->creat_car ("320i"));
    // unique_ptr<Car> banzcar(banzfac->creat_car ("A200"));
    // unique_ptr<Car> car(carfac->creat_car("car"));
    // //生产出来使用  
    // bmwcar->show();
    // banzcar->show();
    // car->show(); 
}

标签:name,creat,Car,Factory,常备,面试,car,new,工厂
From: https://blog.csdn.net/qq_35210952/article/details/141868654

相关文章

  • 最近(2024.08.14-2024.08.25 )面试感悟
    简历最近(2024.08.14-2024.08.25)除了周末,都在面试的路上,平均每天3、4场面试,边面试边回顾知识点边完善简历,在哀鸿遍野的招聘市场里,简历做了调整,突出自己的优势,比如读过spring源码要能清楚的说出来、比如对jvm内存模型的了解,及为什么采用对应的垃圾回收算法;比如遇到的jvm内存及解决......
  • JVM面试(二)内存区域划分
    内存区划分Java虚拟机在执行Java程序的过程中会把它锁管理的内存划分为若干个不同的数据区域。这些区域有各自不同的用途,以及创建和销毁的时间。有的区域随着虚拟机的进程一直存在,有的区域依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》的规定,Java虚拟......
  • 低功耗蓝牙模块在工业4.0中的角色:实现智能工厂的关键
    在当今高速发展的工业自动化时代,无线通信技术的应用越来越广泛,而蓝牙模块作为一种成熟且高效的无线通信手段,正在工业自动化中扮演着越来越重要的角色。本文将详细探讨蓝牙模块在工业自动化中的应用场景、优势以及未来发展前景。蓝牙模块在工业自动化中的应用场景1、设备监控与数据......
  • Java面试——SpringBoot篇
    前置知识ApplicationContextInitializerApplicationContextInitializer是Spring框架中的一个扩展接口,用于在应用程序上下文(ApplicationContext)创建之前对其进行自定义初始化。通过实现该接口,您可以在应用程序上下文启动之前执行一些额外的配置或准备工作。应用场景动态加载......
  • 规控面试复盘
    目录前言一、京东方1、CPP和C的区别是什么?2、讲一下的ROS的话题通信二、Momenta(泊车部门实习面试)1、MPC的预测时间步是多少?2、MPC的代价函数考虑的是什么?三、九识1、智能指针有哪些优缺点?优点:缺点:2、Protobuf的数据传输效率为什么更高?3、Protobuf和ros原生的msg......
  • 我的渗透测试路,如何入门网络安全最高效?附面试经验
    前言这篇先回顾一下我大学时候的渗透经历,再说一下哪几个方面对于渗透测试入门或者发展来说是最重要、最高效的。(知乎的文章编辑功能太辣鸡了,有好多格式问题,建议到我的公众号看噢,公众号二维码位于文章底部)大学的渗透路在高考结束后,我知道了自己的成绩,仅超过一本线几分可......
  • Spark面试高频真题一--Spark基础
    〇、前言Spark是业界常用的大规模分布式数据处理引擎,也是数仓开发最常用的工具组件,通常一二三轮面试官都会或多或少的提问相关的基础问题。下面是总结的常见的面试问题和答案参考。一、Spark基础1.spark和hive的区别是?HiveQL是基于MapReduce框架和HDFS进行数据处理。Spark......
  • 面试速通-SQL编码题
    〇、前话SQL题是数据相关的面试无可避免的小BOSS,虽然不同公司面试出题会披上不同的马甲,侧重各异,但总结起来题型就是那4、5种。下面让我们花上几分钟一起来通关它吧!一、连续日期计算1,例题表字段:用户ID,账户余额,系统余额日期。求出余额大于1000的用户的最大连续天数。2,解题要......
  • 「Java跳槽面试必备」2024年09月最新八股文
    【前言】网上各种面试八股文太多太多,但我今年找了好几个都是很久很久以前的老面试题,老文档了,和我出去面试市场上面试官问的问题基本上不一样了,可以说被打了一个措手不及,浪费了好几个机会,回来又找了好一些资料,以及结合自己最近的面试情况总结了一些心得免费分享给大家!虽然只有几本......
  • Java 面试题:事务隔离级别以及并行事务会出现什么问题&&怎么解决脏读、不可重复读和幻
    文章目录四种事务隔离级别MySQL中设置事务隔离级别四种事务隔离级别在并行事务中可能会遇到的问题脏读、不可重复读和幻读三者区别事务的隔离级别是怎么解决这三个问题的?ReadView是什么ReadView包含的信息ReadView在MVCC中的工作原理工作流程总结事务的隔......