博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(C++)——工厂模式
阅读量:3958 次
发布时间:2019-05-24

本文共 2647 字,大约阅读时间需要 8 分钟。

工厂模式

工厂模式提供了一种创建对象的方式。它将创建的过程隐藏了起来,调用者只负责获取,不关心创建的细节。

具体使用场景来说,就是一个接口类,在不同的场景,需要不同的子类,这个时候就可以使用工厂类,根据提供的参数来返回不同子类的实例。

举个例子:

用户说我想要一个笔记本电脑。
工厂类说,我们这里有三种电脑:逼格高的,光污染的,超轻薄的。
用户想了想说,那就逼格高的吧。
然后工厂类从柜台掏出一台MacBook递给用户。

其实这里用户并不关心你返回的具体是哪个子类,他只关心,你给我的子类符合我传给你的参数。

工厂类便是实现这样的功能,将需求转化为具体的实例。当然,多数情况下,需求本身可能就是子类的名称,比如用户说,我就想要一台苹果电脑。

// LapTop.h#pragma once// 抽象类class LapTop{
public: LapTop() = default; virtual void powerOn() = 0; virtual void shutDown() = 0;}
//LapTopImpl.h#pragma once#include "LapTop.h"#include 
class MacBook final : public LapTop{
public: MacBook() : LapTop() {
}; virtual void powerOn() override {
std::cout << "Hello! Welcome to use MacBook!" << std::endl; } virtual void shutDown() override {
std::cout << "Goodbye! Thanks to use MacBook!" << std::endl; }}class Allienware final : public LapTop{
public: Allienware() : LapTop() {
}; virtual void powerOn() override {
std::cout << "Hello! Welcome to use Allienware!" << std::endl; } virtual void shutDown() override {
std::cout << "Goodbye! Thanks to use Allienware!" << std::endl; }}class ThinkPad final : public LapTop{
public: ThinkPad() : LapTop() {
}; virtual void powerOn() override {
std::cout << "Hello! Welcome to use ThinkPad!" << std::endl; } virtual void shutDown() override {
std::cout << "Goodbye! Thanks to use ThinkPad!" << std::endl; }}}
// LapTopFactory.h#pragma once#include "LapTop.h"enum class LapTopBrand{
MACBOOK, ALLIENWARE, THINKPAD}//工厂类class LapTopFactory{
public: LapTop* getLapTop(LapTopBrand brand);}
// LapTopFactory.cpp#include "LapTopFactory.h"#include "LapTopImpl.h"LapTop* LapTopFactory::getLapTop(LapTopBrand brand){
switch(brand) {
case LapTopBrand::MACBOOK: {
return new MacBook; } case LapTopBrand::ALLIENWARE: {
return new Allienware; } case LapTopBrand::THINKPAD: {
return new ThinkPad; } default: {
return nullptr; }}
//main.cpp#include "LapTopFactory.h"int main(void){
LapTopFactory f; LapTop* ptr = f.getLapTop(LapTopBrand::MACBOOK); ptr->powerOn(); ptr->shutDown(); delete ptr; ptr = f.getLapTop(LapTopBrand::ALLIENWARE); ptr->powerOn(); ptr->shutDown(); delete ptr; ptr = f.getLapTop(LapTopBrand::THINKPAD); ptr->powerOn(); ptr->shutDown(); delete ptr; return 0;}

可以看到,当外界调用时,它只看到了两个类:LapTop和LapTopFactory。对于LapTopFactory如何构造LapTop,使用的new还是资源池(一手还是二手的LapTop)并不关心。此时就可以使用工厂模式。

该类和建造者类有一定的相似,具体我会在建造者类里说明。

转载地址:http://qtxzi.baihongyu.com/

你可能感兴趣的文章
性能调优之性能参数指标
查看>>
POJ3009---冰壶游戏(深搜剪枝+回溯)
查看>>
POJ3669---跳炸弹(广搜)
查看>>
POJ---1384Piggy-Bank (完全背包+装满问题)
查看>>
并查集基础知识
查看>>
POJ1182---食物链(带权并查集~技巧性超强的解法)
查看>>
POJ2492---A Bug's Life(做完食物链,再秒这个)
查看>>
POJ2063---Investment(完全背包)
查看>>
POJ1458---(最长公共子序列最基础题)
查看>>
POJ3356---(最长公共子序列)
查看>>
二叉树基础知识大全(核心理解遍历)
查看>>
03-树1 树的同构(25 分) 2017秋 数据结构 陈越、何钦铭
查看>>
04-树4 是否同一棵二叉搜索树(25 分)---陈越、何钦铭-数据结构-2017秋
查看>>
表达式求值(C实现,实现多括号,浮点数)---栈的实现以及运用。
查看>>
有序链表的合并(数据结构---单链表)
查看>>
栈实现(数据结构---数组,链表 C实现)
查看>>
POJ3903(dp,最长上升子序列,最基础题)
查看>>
POJ1836-Alignment(最长上升子序列)
查看>>
POJ 1251 Jungle Roads(最小生成树简单题)
查看>>
HDU 1690---Bus System(Floyd模板题+合理定义INF)
查看>>