1.工厂模式(Factory Method)
注:图片来源于 https://www.cnblogs.com/-saligia-/p/10216752.html
工厂UML图解析:

工厂模式:client用户需要三步:
1.创建工厂;
2.生产产品对象;
3.使用对象方法。
代码:
工厂类 Factory.h
//
// Created by Halo on 2019/10/14.
// #ifndef FACTORY_FACTORY_H
#define FACTORY_FACTORY_H #include "Product.h" //抽象手机工厂类
class Factory {
public:
//生产手机
virtual Phone* CreatePhone() = ; }; //OPPO手机工厂
class OPPOFactory : public Factory {
public:
//OPPO手机工厂类 use a OPPO手机类
Phone* CreatePhone() override {
return new OPPO();
}
}; //VIVO手机工厂
class VIVOFactory : public Factory {
public:
Phone* CreatePhone() override {
return new VIVO();
}
}; //HUAWEI手机工厂
class HUAWEIFactory : public Factory {
public:
Phone* CreatePhone() override {
return new HUAWEI();
}
}; //XIAOMI手机工厂
class XIAOMIFactory : public Factory {
public:
Phone* CreatePhone() override {
return new XIAOMI();
}
}; #endif //FACTORY_FACTORY_H
产品类 Product.h
//
// Created by Halo on 2019/10/14.
// #ifndef FACTORY_PRODUCT_H
#define FACTORY_PRODUCT_H #include <string> //抽象手机类
class Phone {
public:
//Phone() = default;;
//得到手机名称
virtual std::string Say() = ;
//~Phone() = default;
}; //具体手机类:OPPO
class OPPO : public Phone {
public:
//OPPO() = default;
std::string Say() override {
return "OPPO 音乐手机!";
}
//~OPPO() = default;
};
//具体手机类:VIVO
class VIVO : public Phone {
public:
//VIVO() = default;
std::string Say() override {
return "VIVO 照相手机!";
}
//~VIVO() = default;
};
//具体手机类:HUAWEI
class HUAWEI : public Phone {
public:
//HUAWEI() = default;
std::string Say() override {
return "HUAWEI 商务手机!";
}
//~HUAWEI() = default;
};
//具体手机类:XIAOMI
class XIAOMI : public Phone {
public:
//XIAOMI() = default;
std::string Say() override {
return "XIAOMI 性价比手机!";
}
//~XIAOMI() = default;
}; #endif //FACTORY_PRODUCT_H
用户 main.cpp
#include <iostream>
#include "Factory.h"
using namespace std; int main() {
//创建OPPO手机工厂
Factory* f1 = new OPPOFactory();
//OPPO手机工厂制造手机
Phone* p1 = f1->CreatePhone();
//OPPO手机口号
cout << p1->Say() << endl; Factory* f2 = new VIVOFactory();
Phone* p2 = f2->CreatePhone();
cout << p2->Say() << endl; Factory* f3 = new HUAWEIFactory();
Phone* p3 = f3->CreatePhone();
cout << p3->Say() << endl; Factory* f4 = new XIAOMIFactory();
Phone* p4 = f4->CreatePhone();
cout << p4->Say() << endl; return ;
}
1.工厂模式(Factory Method)的更多相关文章
- c++工厂模式(Factory method)
下面以女娲造黑人,白人,黄种人的例子来介绍一下工厂模式. 1.工厂的接口,相当于造人工厂总部. class IHumanFactory { public: IHumanFactory(void) { ...
- 设计模式——工厂模式(Factory Method)
工厂方法模式,定义一个用于创建对象的接口,让子类决定实例化哪个类.工厂方法使一个类的实例化延迟到其子类. UML图: 运算基类: package com.cnblog.clarck; /** * 数据 ...
- 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern)
原文:乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 工厂方法模式(Factory Method Pa ...
- 【设计模式】工厂方法模式 Factory Method Pattern
在简单工厂模式中产品的创建统一在工厂类的静态工厂方法中创建,体现了面形对象的封装性,客户程序不需要知道产品产生的细节,也体现了面向对象的单一职责原则(SRP),这样在产品很少的情况下使用起来还是很方便 ...
- 工厂方法模式-Factory Method(Java实现)
工厂方法模式-Factory Method 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法让实例化的具体内容交给子类工厂来进行. 本文中的例子是这样的. 生产一个身份证, ...
- 二十四种设计模式:工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern) 介绍定义一个用于创建对象的接口,让子类决定将哪一个类实例化.Factory Method使一个类的实例化延迟到其子类. 示例有SqlMes ...
- 设计模式-03工厂方法模式(Factory Method Pattern)
插曲.简单工厂模式(Simple Factory Pattern) 介绍工厂方法模式之前,先来做一个铺垫,了解一下简单工厂模式,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背 ...
- 六个创建模式之工厂方法模式(Factory Method Pattern)
问题: 在使用简单工厂模式的时候,如果添加新的产品类,则必需修改工厂类,违反了开闭原则. 定义: 定义一个用于创建对象的接口,让子类决定具体实例化哪个产品类.此时工厂和产品都具有相同的继承结构,抽象产 ...
- 工厂模式(Factory Patter)
1.工厂模式简介 工厂模式属于创建型模式,是专门用来创建对象的模式,抽象了实例化的过程.工厂模式分为 : 工厂方法模式.抽象工厂模式. 在学习工厂方法模式.抽象工厂之前,首先先要了解一下简单工厂模式, ...
- Spring 通过工厂方法(Factory Method)来配置bean
Spring 通过工厂方法(Factory Method)来配置bean 在Spring的世界中, 我们通常会利用bean config file 或者 annotation注解方式来配置bean. ...
随机推荐
- 数据仓库DW、ODS、DM概念及其区别
整体结构 在具体分析数据仓库之前先看下一下数据中心的整体架构以及数据流向 数据中心整体架构.png DB 是现有的数据来源,可以为mysql.SQLserver.文件日志等,为数据仓库提供数据来源 ...
- Python10个图像处理工具
原文地址:https://cloud.tencent.com/developer/article/1498116 译者 | 小韩 来源 | towardsdatascience [磐创AI导读]:本篇 ...
- 微信小程序开发——修改小程序原生checkbox、radio默认样式
复选框: 闲话少说,这里直接介绍如何修改小程序提供的复选框的样式,如原生的是这样的: 需要的是这样的: 示例代码: /*复选框外框样式*/ checkbox .wx-checkbox-input { ...
- Android 加密之文件级加密(CE/DE)
https://blog.csdn.net/myfriend0/article/details/77094890/ Android加密之文件级加密
- SpringBoot MAVEN编译报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.0:
参考了好几篇文章没搞定,直到查询错误关键字 An unknown compilation problem occurred 分别参考了以下博客: https://blog.csdn.net/fanre ...
- Python3.7安装(解决ssl问题)
摘自:https://blog.csdn.net/love_cjiajia/article/details/82254371 python3.7安装(解决ssl的问题) 1) 安装准备 yum -y ...
- [译]如何比较master分支上与git上任意的一个老版本的区别?
原文来源:https://stackoverflow.com/questions/5586383/how-to-diff-one-file-to-an-arbitrary-version-in-git ...
- Laya的滚动容器
想实现一个简单的滚动容器.例如水平排列10个图标,可以左右滑动查看的. Egret里有布局容器可以滚动 Laya看了教程和示例,没有找到一个滚动容器,只有一个list,需要设置item,显然不是我想要 ...
- 【LeetCode算法-21】Merge Two Sorted Lists
LeetCode第21题 Merge two sorted linked lists and return it as a new list. The new list should be made ...
- 又一神器框架:linq.js
1.支持jQuery插件的方式.jquery.linq.min.js. 2.也可以像普通js方法一样使用.linq.min.js. 3.当然用习惯VS的童鞋肯定希望有个良好的智能感知,是的,它支持. ...