【设计模式】工厂模式——创建对象的最佳方式
来源:互联网 发布:辅导软件 编辑:程序博客网 时间:2024/06/05 05:38
工厂模式中,创建对象时不会对客户端暴露创建逻辑,通过使用一个共同的接口来指向新创建的对象。
简单工厂模式
运用面向对象的继承和多态,将对象的创建放到工厂中,根据需求(用参数表明),来判断需要什么类型的对象,就创建什么类型的对象。一个简单的例子:
//simpleFactory.h
#include <iostream>#include <string>//基类class animal{public: virtual void sleep() = 0;};//子类1class cat :public animal{public: void sleep(){ std::cout << "cat sleep..." << std::endl; }};//子类2class dog :public animal{public: void sleep(){ std::cout << "dog sleep..." << std::endl; }};//简单工厂class animalFactory{public: animalFactory(){}; animal *getAnimal(std::string animalType){ //判断需要什么类型的animal,就创建什么类型的animal //利用了面向对象的多态 if (animalType.empty()){ std::cout << "no animal type input..." << std::endl; return nullptr; } if (animalType == "dog"){ return new dog(); } if (animalType == "cat"){ return new cat(); } }};
main.cpp
#include "simpleFactory.h"int main(){ animalFactory an; animal *dog = an.getAnimal("dog"); dog->sleep(); animal *cat = an.getAnimal("cat"); cat->sleep(); system("pause"); return 0;}
输出:
dog sleep...cat sleep...
工厂方法模式
简单工厂模式是一种用于创建对象的好方法,但它有一个很致命的缺点,就是如果要增加产品类型,就要修改工厂类,这违反了设计模式的“开放关闭”原则(对扩展开放,对修改关闭),在此基础上,出现了工厂方法模式,其原理就是将每一种产品的创建分别设计一个工厂,这样,增加产品不需要改变工厂类,但其缺点是需要增加一个对应产品的工厂。
factoryFunction.h
#include <iostream>#include <string>//基类class animal{public: virtual void sleep() = 0;};//子类1class cat :public animal{public: void sleep(){ std::cout << "cat sleep..." << std::endl; }};//子类2class dog :public animal{public: void sleep(){ std::cout << "dog sleep..." << std::endl; }};//工厂抽象class animalFactory{public: animalFactory(){}; virtual animal *getAnimal() = 0;};//狗狗工厂class dogFactory :public animalFactory{public: dog*getAnimal(){ return new dog(); }};//猫咪工厂class catFactory :public animalFactory{public: cat*getAnimal(){ return new cat(); }};
mian.cpp
#include "factoryFunction.h"int main(){ dogFactory dogF; animal *dog1 = dogF.getAnimal(); dog1->sleep(); catFactory catF; animal *cat1 = catF.getAnimal(); cat1->sleep(); system("pause"); return 0;}
输出
dog sleep...cat sleep...
抽象工厂模式
一个工厂通常不会只生产一种类型产品,也可以生产相似类型产品,抽象工厂模式就是将相似的产品放到一个工厂中生产,而不必要重新建设一个工厂,实例中,白猫和黑猫是相似的产品,所以可以在同一个工厂中生产。
abstractFectory.h
#include <iostream>#include <string>//基类class animal{public: virtual void sleep() = 0;};//子类1class whiteCat :public animal{public: void sleep(){ std::cout << "white cat sleep..." << std::endl; }};//子类2class blackCat :public animal{public: void sleep(){ std::cout << "black cat sleep..." << std::endl; }};//子类3class whiteDog :public animal{public: void sleep(){ std::cout << "white dog sleep..." << std::endl; }};//子类4class blackDog :public animal{public: void sleep(){ std::cout << "balck dog sleep..." << std::endl; }};//工厂抽象class animalFactory{public: animalFactory(){}; virtual animal *getBlackAnimal() = 0; virtual animal *getWhiteAnimal() = 0;};//狗狗工厂class dogFactory :public animalFactory{public: whiteDog *getWhiteAnimal(){ return new whiteDog(); } blackDog *getBlackAnimal(){ return new blackDog(); }};//猫咪工厂class catFactory :public animalFactory{public: whiteCat *getWhiteAnimal(){ return new whiteCat(); } blackCat *getBlackAnimal(){ return new blackCat(); }};
main.cpp
#include "abstractFectoryPattren.h"int main(){ dogFactory dogF; whiteDog *wd = dogF.getWhiteAnimal(); wd->sleep(); blackDog *bd = dogF.getBlackAnimal(); bd->sleep(); catFactory catF; whiteCat *wc = catF.getWhiteAnimal(); wc->sleep(); blackCat *bc = catF.getBlackAnimal(); bc->sleep(); system("pause"); return 0;}
输出
white dog sleep...balck dog sleep...white cat sleep...black cat sleep...
阅读全文
0 0
- 【设计模式】工厂模式——创建对象的最佳方式
- js 创建对象的三种方式——工厂模式、构造函数模式、原型模式
- 设计模式(对象创建)——工厂方法模式
- 设计模式(对象创建)——抽象工厂模式
- 用来创建对象的设计模式之抽象工厂模式
- JavaScript——创建对象的五种方式分析(工厂模式 原型 构造函数)
- 对象的工厂模式创建
- 设计模式——创建型模式之工厂模式
- 设计模式【2】:工厂方法【创建对象】
- 设计模式【3】:抽象工厂【创建对象】
- 设计模式深入浅出(一)对象创建——工厂方法,抽象工厂
- 设计模式之ABSTRACT FACTORY(抽象工厂)—对象创建型模式
- 设计模式之对象创建型 — abstract_factory 抽象工厂模式
- 设计模式之对象创建型 — Factory Method 工厂方法模式
- 浅谈设计模式——对象的创建型模式
- 工厂模式创建对象
- Java 设计模式—工厂模式(三种方式)
- JS面向对象的几种创建方式:工厂模式、构造函数模式、原型模式、混合模式、动态原型模式
- AES加密解密
- 14章图像处理
- TCP三次握手和四次挥手过程
- Struts2 ognl判断集合对象是否为空的方法
- 微信“15。。。。。”背后的故事
- 【设计模式】工厂模式——创建对象的最佳方式
- electron 下载文件功能
- hdu 1014 最大公约数
- 爬虫学习笔记--爬取百度贴吧
- 剑指offer第17题(树的子结构)
- 第八章 Android开发规范整理以及Strings.xml定义规范化
- java-web项目的分页与联合模糊查询(不使用分页框架)
- 知识点摘要
- 内轮差编辑内轮差