工厂方法模式和抽象工厂模式
工厂方法模式和抽象工厂模式
- 工厂方法模式
- 抽象工厂模式
- 总结:
工厂方法模式
#include <string>
#include <iostream>// Abstract
class Splitter
{
private:/* data */
public:Splitter(/* args */);virtual ~Splitter();
public:virtual void split() = 0;
};Splitter::Splitter(/* args */)
{
}Splitter::~Splitter()
{
}class BinarySplitter : public Splitter
{
private:/* data */
public:BinarySplitter(/* args */);~BinarySplitter();void split();
};BinarySplitter::BinarySplitter(/* args */)
{
}BinarySplitter::~BinarySplitter()
{
}void BinarySplitter::split() {std::cout << "Binary split" << std::endl;
}class TxtSplitter : public Splitter
{
private:/* data */
public:TxtSplitter(/* args */);~TxtSplitter();void split();
};TxtSplitter::TxtSplitter(/* args */)
{
}TxtSplitter::~TxtSplitter()
{
}void TxtSplitter::split() {std::cout << "Txt split"<< std::endl;
}class PictureSplitter : public Splitter
{
private:/* data */
public:PictureSplitter(/* args */);~PictureSplitter();void split();
};PictureSplitter::PictureSplitter(/* args */)
{
}PictureSplitter::~PictureSplitter()
{
}void PictureSplitter::split() {std::cout << "Picture split" << std::endl;
}class VideoSplitter : public Splitter
{
private:/* data */
public:VideoSplitter(/* args */);~VideoSplitter();void split();
};VideoSplitter::VideoSplitter(/* args */)
{
}VideoSplitter::~VideoSplitter()
{
}void VideoSplitter::split() {std::cout << "Video split" << std::endl;
}
#include <string>
#include "splitter.hpp"// Factory 是一个工厂
class Factory
{
private:/* data */
public:Factory(/* args */);virtual Splitter* creat_splitter(std::string splitter) = 0;~Factory();
};Factory::Factory(/* args */)
{
}Factory::~Factory()
{
}Splitter* Factory::creat_splitter(std::string splitter) {
}class TxtFactory : public Factory
{
private:/* data */
public:TxtFactory(/* args */);~TxtFactory();Splitter* creat_splitter(std::string splitter);
};TxtFactory::TxtFactory(/* args */)
{
}TxtFactory::~TxtFactory()
{
}Splitter* TxtFactory::creat_splitter(std::string splitter) {return new TxtSplitter();
}class PictureFactory : public Factory
{
private:/* data */
public:PictureFactory(/* args */);~PictureFactory();Splitter* creat_splitter(std::string splitter);
};PictureFactory::PictureFactory(/* args */)
{
}PictureFactory::~PictureFactory()
{
}Splitter* PictureFactory::creat_splitter(std::string splitter) {return new PictureSplitter();
}class VideoFactory : public Factory
{
private:/* data */
public:VideoFactory(/* args */);~VideoFactory();Splitter* creat_splitter(std::string splitter);
};VideoFactory::VideoFactory(/* args */)
{
}VideoFactory::~VideoFactory()
{
}Splitter* VideoFactory::creat_splitter(std::string splitter) {return new VideoSplitter();
}class BinaryFactory : public Factory
{
private:/* data */
public:BinaryFactory(/* args */);~BinaryFactory();Splitter* creat_splitter(std::string splitter);
};BinaryFactory::BinaryFactory(/* args */)
{
}BinaryFactory::~BinaryFactory()
{
}Splitter* BinaryFactory::creat_splitter(std::string splitter) {return new BinarySplitter();
}
#include <iostream>
#include "splitter.hpp"
#include "splitter_factory.hpp"class Mainform
{
private:Factory* factory_;/* data */
public:Mainform(Factory *factory);~Mainform();Splitter* get_splitter();
};Mainform::Mainform(Factory *factory) {factory_ = factory;
}Mainform::~Mainform()
{
}Splitter* Mainform::get_splitter() {return factory_->creat_splitter("xxx");
}
#include <iostream>
#include "splitter.hpp"
#include "splitter_factory.hpp"
#include "mainform.hpp"int main()
{// 最外面使用的时候, 肯定是要创建一个具体的工厂类,然后把具体的工厂类提供给我们的对外接口类// 由这个对外接口类返回一个具体的产品 TxtFactory txtfactory;Mainform mainform(&txtfactory);Splitter* splitter = mainform.get_splitter();return 0;
}
抽象工厂模式
#include <vector>// 第二
// 下面的函数中, 用到了三个具体类型, 根据这三个具体类型,我们就需要定义三个抽象类型
// 同时我们说,抽象工厂模式主要解决的问题是,需要创建一系列相关的对象,下面三个对象就是一系列相关的对象
class AbConnection
{
private:/* data */
public:AbConnection(/* args */);~AbConnection();
};AbConnection::AbConnection(/* args */)
{
}AbConnection::~AbConnection()
{
}class AbCommand
{
private:/* data */
public:AbCommand(/* args */);~AbCommand();
};AbCommand::AbCommand(/* args */)
{
}AbCommand::~AbCommand()
{
}class AbDataReader
{
private:/* data */
public:AbDataReader(/* args */);~AbDataReader();
};AbDataReader::AbDataReader(/* args */)
{
}AbDataReader::~AbDataReader()
{
}// 第三
// 下面函数中用到了三个具体类型,那么就需要定义三个具体的类型
// 支持Sql的数据库相关的类型
class SqlConnection : public AbConnection
{
private:/* data */
public:SqlConnection(/* args */);~SqlConnection();
};SqlConnection::SqlConnection(/* args */)
{
}SqlConnection::~SqlConnection()
{
}class SqlCommand : public AbCommand
{
private:/* data */
public:SqlCommand(/* args */);~SqlCommand();
};SqlCommand::SqlCommand(/* args */)
{
}SqlCommand::~SqlCommand()
{
}class SqlDataReader : public AbDataReader
{
private:/* data */
public:SqlDataReader(/* args */);~SqlDataReader();
};SqlDataReader::SqlDataReader(/* args */)
{
}SqlDataReader::~SqlDataReader()
{
}// 支持Oracle的数据库相关类型
class OracleConnection : public AbConnection
{
private:/* data */
public:OracleConnection(/* args */);~OracleConnection();
};OracleConnection::OracleConnection(/* args */)
{
}OracleConnection::~OracleConnection()
{
}class OracleCommand : public AbCommand
{
private:/* data */
public:OracleCommand(/* args */);~OracleCommand();
};OracleCommand::OracleCommand(/* args */)
{
}OracleCommand::~OracleCommand()
{
}class OracleDataReader : public AbDataReader
{
private:/* data */
public:OracleDataReader(/* args */);~OracleDataReader();
};OracleDataReader::OracleDataReader(/* args */)
{
}OracleDataReader::~OracleDataReader()
{
}// // 第五步
// // 因为第四步的使用中,new的部分还有具体的类型,这个时候我们可以考虑先使用工厂模式进行实现,
// // 于是针对上面的三个抽象基类,需要定义三个抽象基类对应的三个抽象工厂// class AbConnectionFactory
// {
// private:
// /* data */
// public:
// AbConnectionFactory(/* args */);
// ~AbConnectionFactory();
// virtual AbConnection* CreatConnection() = 0;
// };// AbConnectionFactory::AbConnectionFactory(/* args */)
// {
// }// AbConnectionFactory::~AbConnectionFactory()
// {
// }// class AbCommandFactory
// {
// private:
// /* data */
// public:
// AbCommandFactory(/* args */);
// ~AbCommandFactory();
// virtual AbCommand* CreatCommand() = 0;
// };// AbCommandFactory::AbCommandFactory(/* args */)
// {
// }// AbCommandFactory::~AbCommandFactory()
// {
// }// class AbDataReaderFactory
// {
// private:
// /* data */
// public:
// AbDataReaderFactory(/* args */);
// ~AbDataReaderFactory();
// virtual AbDataReader* CreatDataReader() = 0;
// };// AbDataReaderFactory::AbDataReaderFactory(/* args */)
// {
// }// AbDataReaderFactory::~AbDataReaderFactory()
// {
// }// 第十步
// 既然三个工厂创建的三个产品之间是相互关联的,那我们就可以考虑,将三个工厂方法合并成一个工厂工厂方法
// 既然是三个工厂方法的基类合并成一个了,我们就实际是定义了一个抽象工厂
// 于是就可以把下面的三个工厂方法的基类给合并成一个,
// 我们就可以把第五步的三个工厂方法给改成一个class AbDatabaseFactory
{
private:/* data */
public:AbDatabaseFactory(/* args */);~AbDatabaseFactory();virtual AbConnection* CreatConnection() = 0;virtual AbCommand* CreatCommand() = 0;virtual AbDataReader* CreatDataReader() = 0;
};AbDatabaseFactory::AbDatabaseFactory(/* args */)
{
}AbDatabaseFactory::~AbDatabaseFactory()
{
}// // 第六步
// // 有了抽象工厂方法类之后, 就需要三个具体工厂方法类
// // 这里因为有Sql和Oracle,然后是三个类,所以需要六个具体的工厂方法类
// class SqlConnectionFactory : public AbConnectionFactory
// {
// private:
// /* data */
// public:
// SqlConnectionFactory(/* args */);
// ~SqlConnectionFactory();
// };// SqlConnectionFactory::SqlConnectionFactory(/* args */)
// {
// }// SqlConnectionFactory::~SqlConnectionFactory()
// {
// }// class SqlCommandFactory : public AbCommandFactory
// {
// private:
// /* data */
// public:
// SqlCommandFactory(/* args */);
// ~SqlCommandFactory();
// };// SqlCommandFactory::SqlCommandFactory(/* args */)
// {
// }// SqlCommandFactory::~SqlCommandFactory()
// {
// }// class SqlDataReader : public AbDataReaderFactory
// {
// private:
// /* data */
// public:
// SqlDataReader(/* args */);
// ~SqlDataReader();
// };// SqlDataReader::SqlDataReader(/* args */)
// {
// }// SqlDataReader::~SqlDataReader()
// {
// }// class OracleConnectionFactory : public AbConnectionFactory
// {
// private:
// /* data */
// public:
// OracleConnectionFactory(/* args */);
// ~OracleConnectionFactory();
// };// OracleConnectionFactory::OracleConnectionFactory(/* args */)
// {
// }// OracleConnectionFactory::~OracleConnectionFactory()
// {
// }// class OracleCommandFactory : public AbCommandFactory
// {
// private:
// /* data */
// public:
// OracleCommandFactory(/* args */);
// ~OracleCommandFactory();
// };// OracleCommandFactory::OracleCommandFactory(/* args */)
// {
// }// OracleCommandFactory::~OracleCommandFactory()
// {
// }// class OracleDataReaderFactory : public AbDataReaderFactory
// {
// private:// public:
// OracleDataReaderFactory(/* args */);
// ~OracleDataReaderFactory();
// };// OracleDataReaderFactory::OracleDataReaderFactory(/* args */)
// {
// }// OracleDataReaderFactory::~OracleDataReaderFactory()
// {
// }// 第十一步
// 同样的道理, 既然我三个工厂方法的基类已经合成一个了, 那么我的Sql的三个工厂方法,和Oracle的三个工厂方法也应该合成一个
// 于是可以把第六步中的内容修改如下class SqlDatabaseFactory : public AbDatabaseFactory
{
private:/* data */
public:SqlDatabaseFactory(/* args */);~SqlDatabaseFactory();AbConnection* CreatConnection();AbCommand* CreatCommand();AbDataReader* CreatDataReader();
};SqlDatabaseFactory::SqlDatabaseFactory(/* args */)
{
}SqlDatabaseFactory::~SqlDatabaseFactory()
{
}AbConnection* SqlDatabaseFactory::CreatConnection() {return new SqlConnection();
}
AbCommand* SqlDatabaseFactory::CreatCommand() {return new SqlCommand();
}
AbDataReader* SqlDatabaseFactory::CreatDataReader() {return new SqlDataReader();
}class OracleDatabaseFactory : public AbDatabaseFactory
{
private:/* data */
public:OracleDatabaseFactory(/* args */);~OracleDatabaseFactory();AbConnection* CreatConnection();AbCommand* CreatCommand();AbDataReader* CreatDataReader();
};OracleDatabaseFactory::OracleDatabaseFactory(/* args */)
{
}OracleDatabaseFactory::~OracleDatabaseFactory()
{
}AbConnection* OracleDatabaseFactory::CreatConnection() {return new OracleConnection();
}
AbCommand* OracleDatabaseFactory::CreatCommand() {return new OracleCommand();
}
AbDataReader* OracleDatabaseFactory::CreatDataReader() {return new OracleDataReader();
}class EmployeeDAO
{
private:// // 第七步// // 因为需要在后面的函数中get_employees中,所以需要先定义三个抽象的工厂// // 用户在创建一个EmployeeDAO的时候, 在构造函数中,需要传入具体的三个工厂,用来初始化三个抽象工厂// AbConnectionFactory* ab_connection_factory;// AbCommandFactory* ab_command_factory;// AbDataReaderFactory* ab_datareader_factory;// 第十二步// 既然已经有了抽象工厂模式,这个时候就可以把第七步中的三个工厂合并成一个工厂了AbDatabaseFactory* ab_database_factory;// 第九步// 看看问题所在// 我们在实际使用中, 需要在main函数中,调用EmployeeDAO的构造函数,第七步中说了,实例化一个EmployeeDAO的时候// 需要传入三个具体的工厂,在构造函数中, 把上面三个抽象的工厂给实例化了// 那么我们传入的三个工厂必须是同一个类型的三个抽象工厂// 比如第一个工厂是Sql的,那么第二个工厂不能是Oracle的,因为在下面的一个函数的实际使用中,三个工厂做出来的实际对象// 三个具体对象之间是有直接关系的, 是相互依赖的public:EmployeeDAO(/* args */);~EmployeeDAO();std::vector<EmployeeDAO> get_employees();
};EmployeeDAO::EmployeeDAO(/* args */)
{
}EmployeeDAO::~EmployeeDAO()
{
}// 第一
// 如下就是一系列相互依赖的对象
// 同时存在一个问题就是,如果下次变成了MySql或者Redis的时候,下面函数的整个实现都需要修改
// std::vector<EmployeeDAO> EmployeeDAO::get_employees() {
// SqlConnection* connect = new SqlConnection();
// connect->ConnectString = "xxx";// SqlCommand* command = new SqlCommand();
// command->set_connection(connec);
// command->CommandTxt = "xxx";// SqlDataReader* reader = command->ExecuteReader();
// while (read->Read())
// {
// std::cout << "xxx" << std::endl;
// }// }// // 第四步
// // 既然上面定义抽象类型了, 所以我们需要重新写第一中的内容, 把其中用到具体类型的地方, 都修改成使用抽象类型的对象// std::vector<EmployeeDAO> EmployeeDAO::get_employees() {
// AbConnection* connect = new SqlConnection();// connect->ConnectString = "xxx";// AbCommand* command = new SqlCommand();
// command->set_connection(connec);
// command->CommandTxt = "xxx";// AbDataReader* reader = command->ExecuteReader();
// while (read->Read())
// {
// std::cout << "xxx" << std::endl;
// }// }// // 第八步
// // 因为上面在类内部定义了三个抽象的工厂指针,所以需要在函数里面使用抽象的工厂指针进行创建具体的产品// std::vector<EmployeeDAO> EmployeeDAO::get_employees() {
// AbConnection* connect = ab_connection_factory->CreatConnection();
// connect->ConnectString = "xxx";// AbCommand* command = ab_command_factory->CreatCommand();
// // 另外需要注意的点是,三个对象之间具有相关性,这个是抽象工厂方法的精髓所在,一定是一系列对象之间具有相关性
// command->set_connection(connec);
// command->CommandTxt = "xxx";// AbDataReader* reader = command->ExecuteReader();
// while (read->Read())
// {
// std::cout << "xxx" << std::endl;
// }// }// 第十三步
// 我们有了一个三合一的抽象工厂,那么这个时候就可以把第八步的内容给修改了
// 当然在定义这个类,EmployeeDAO的时候, 我们还是需要传入一个子类 抽象工厂 的,比如SqlDatabaseFactorystd::vector<EmployeeDAO> EmployeeDAO::get_employees() {AbConnection* connect = ab_database_factory->CreatConnection();connect->ConnectString = "xxx";AbCommand* command = ab_database_factory->CreatCommand();// 另外需要注意的点是,三个对象之间具有相关性,这个是抽象工厂方法的精髓所在,一定是一系列对象之间具有相关性 command->set_connection(connec);command->CommandTxt = "xxx";AbDataReader* reader = command->ExecuteReader();while (read->Read()){std::cout << "xxx" << std::endl;}}
总结:
工厂方法模式:
一般用于我们需要根据不通的情况创建不同的产品, 为了让客户调用的时候不用依赖具体的类,使用工厂方法模式, 一般需要创建创建四组类:
第一种: 抽象产品类 Product
第二种:具体产品类,其父类是Product,具体产品类可以是ProductA,ProductB
第三种:抽象工厂方法类 AbFactory,他提供了一个接口CreateProduct,用于创建产品Product
第四种:具体工厂方法类,其父类是AbFactory,具体工厂方法类可以是FactoryA, FactoryB…,FactoryA和FactoryB都需要实现从父类集成来的CreateProduct,只不过FactoryA返回的是ProductA, FactoryB返回的是ProductB
用户在使用的过程中,大概用法如下:
第一步定义自己需要具体工厂比如FactoryA fa,
第二步调用fa的CreateProduct方法,获取具体子类ProductA
抽象工厂模式:用于解决需要创建一系列相互依赖的对象, 重点是解决相互依赖
我们可以先使用工厂方式模式解决这个问题,这里也需要四组类型
第一种: 抽象产品类 Product
第二种:具体产品类,其父类是Product,具体产品类可以是ProductA,ProductB
我们这里可能还有其他抽象类,比如Goods,和上面类似, 需要父类Goods, 和子类GoodsA, GoodsB
第三种:工厂方法父类ProductFactory,GoodsFactory,分别提供CreateProduct和CreateGoods
第四种:具体的工厂方法类ProductFactoryA, ProductFactoryB,GoodsFactoryA, GoodsFactoryB
在使用的时候考虑这样子一种使用场景, 我们可以利用ProductFactoryA和GoodsFactoryA创建ProductA,和GoodsA,并且ProductA和GoodsA是相互相关的, 那么用户在使用的过程中, 可能出现如下问题, 创建了ProductA和GoodsB,使用上就会出现错误,
于是我们把上面的第三种和第四种类型改动一下,第三种类型中, 我们把工厂(ProductFactory和GoodsFactory)合二为一变成ThingsFactory, 他提供提供了两个方法 CreateProduct和CreateGoods
第四种实现具体的工厂, ThingsFactoryA在实现CreateProduct和CreateGoods时分别返回 ProductA和GoodsA, 同理ThingsFactoryB
用户使用的时候:
第一步,定义自己具体需要的抽象工厂 ThingsFactoryA tfa;
Product pa = tfa.CreateProduct()
Goods ga = tfa.CreateGoods()
相关文章:
关于JQuery中的ajax请求或者post请求的回调方法中的操作执行或者变量修改没反映的问题...
前段时间做一个项目,而项目中所有的请求都要用jquery 中的ajax请求或者post请求,但是开始处理一些简单操作还好,但是自己写了一些验证就出现问题了,比如表单提交的时候,要验证帐号的唯一性,所以要在submit前…
下列关于Java多线程并发控制_下列关于Java多线程并发控制机制的叙述中,错误的是...
下列叙述成都望江楼的造景手法有()。竹文化景观应体现科学性与艺术性的和谐统一,关于既要满足植物的生态习性,又能体现美学价值。在中国传统的审美趣味、多线伦理道德上,竹在造园中被拟人化为( )的代表。程并错误下列不属于竹文化旅游的发展趋…
一.vtun源码学习笔记
1.守护进程 (1)守护进程简介 守护进程,也就是我们通常所说的Daemon进程。它是一个生存期较长的进程,它通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。 它与普通进程相比有下面这些特殊性:守护进程最重要的…
获取data 数据
export function getData(el, name, val) {const prefix data-if (val) {return el.setAttribute(prefix name, val)}return el.getAttribute(prefix name) } 转载于:https://www.cnblogs.com/hss-blog/p/9781816.html
java jwks_Java SpringBoot 如何使用 IdentityServer4 作为验证服务器学习笔记
这边记录下如何使用IdentityServer4 作为 Java SpringBoot 的 认证服务器和令牌颁发服务器。本人也是新手,所以理解不足的地方请多多指教。另外由于真的很久没有写中文了,用词不太恰当的地方也欢迎新手大佬小伙伴指出,一起进步。另外这边令牌…
git 快速复制一个新项目
gitlab创建项目a及一个主分支master 本地整体复制已有项目b 本地克隆gitlab上新创建的项目a(git clone gitlab地址) 将本地克隆过来的a文件夹下的.git目录拷贝到b项目下(cp -r .git …/b,注意是两个点,不是三个点,写两…
微信公众平台消息接口星标功能
【微信公众平台星标功能接口被撤销】微信公众平台消息接口中的星标功能,被悄悄的去掉了。 原因应该是有的账号在程序中大量使用星标功能,造成微信服务器存储记录过于宠大。 现在要继续使用星标功能,只能在后台手工操作。 <xml> <ToU…
国庆双节长假旅游出行必装的手机软件
长假即将来临,如果打算出去溜达溜达,透透气的朋友,本文可千万别错过了。今天将介绍几款应用是旅途中绝对不能缺少的,这些应用都非常好用、功能全面,是出行必备的手机软件,希望可以伴你度过快乐的十一长假。…
Windbg双机调试环境配置(Windows7/Windows XP+VirtualBox/VMware+WDK7600)
简介:Windbg双机调试内核、驱动 下载软件: 下载Windbg(GRMWDK_EN_7600_1.ISO)下载VirtualBox 5.2/VMware 12一、安装WDK,这里要提一点的是Debugging Tools for Windows一定要打勾,因为我们后面就是要通过这个工具来进行双机调试的…
哈夫曼树的java实现_java实现哈夫曼树
哈夫曼译码,就是将输入的译码还原成对应的字符。 抽象的算法描述:将建立哈夫曼树、实现哈夫曼编码、哈夫曼译码都定义成 子函数的的形式, 然后在主函数中调用它们......数据结构课程设计设计题目: 哈夫曼树及其应用学 院:计算机科学与技术 专业:网络...用哈夫曼树实现图像压缩_…
on-my-zsh git 仓库下运行卡顿
在 oh-my-zsh 进入 包含 git 仓库目录时,执行 ls 时会比较卡顿 原因: oh-my-zsh 要获取 git 更新信息 解决办法: 设置 oh-my-zsh 不读取文件变化信息(在 git 项目目录执行下列命令) $ git config --add oh-my-zsh…
oracle, group by, having, where
选择列表中如果包含有列、表达式时,这个列、表达式必须包含在Group By子句中。另外,如果采用了表达式的话,则数据库管理员即使在选择列表中采用了别名,但是在Group By子句中仍然必须采用表达式的完整表达方式,而不能够…
[转载] CSS模块化【封装-继承-多态】
第一次听到“CSS模块化”这个词是在WebReBuild的第四届“重构人生”年会上,当时我还想,“哈,CSS也有模块化,我没听错吧?”事实上,我没听错,你也没看错,早就有CSS模块化这个概念了。之…
用jQuery写的一个翻页,并封装为插件,
用jQuery写的一个翻页,并封装为插件, 1 *{2 margin:0;3 padding: 0;4 list-style: none;5 text-decoration: none;6 }7 .page{8 width:500px;9 margin:100px auto; 10 color: #ccc; 11 } 12 .page a{ 13 display: inlin…
Ubuntu 将 /home 或 /var 目录挂载到新的分区
背景 在使用 docker 的过程中,docker 会将某些产物放到 /var/lib/docker/volumes 这会占用很大的跟目录磁盘空间,于是想办法将 /var 目录挂载到另一个一个单独的磁盘上面。 参考链接如下:Ubuntu将var目录挂载到新硬盘 步骤 1. 查看当前磁…
php 500 内部服务器错误,php 500 - 内部服务器错误的解决方法
php 500 - 内部服务器错误的解决方法发布时间:2020-11-04 09:55:31来源:亿速云阅读:71作者:小新小编给大家分享一下php 500 - 内部服务器错误的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家…
网游生命周期在百度指数曲线上呈“M”形分布,各阶段搜索行为呈一定特征
(本文转载自:http://data.baidu.com/youxi3/part1.html) 产品生命周期就是一种新产品从开始进入市场到被市场淘汰的整个过程,进人和退出市场分别标志着周期的开始和结束。网络游戏的生命周期一般可以划分成测试期、成长期、成熟期…
配置Open***使用User/Pass方式验证登录
Open***和PPTP ***相比存在诸多的优势,最明显的是Open***支持NAT穿越,也就是说在nat环境下使用open***只需要一个在路由器上做一个端口映射即可!不需要其他路由的支持,要知道不是所有的路由器都支持配置NAT穿越,只有高…
常惠琢 201771010102《面向对象程序设计(java)》第七周学习总结
实验七 继承附加实验 实验时间 2018-10-11 1、实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途; (2)掌握Object类的常用API用法; (3)掌握ArrayList类用法与常用API&#…
nginx php站点配置文件,php网站修改默认访问文件的nginx配置
搭建好lnmp后,有时候并不需要直接访问index.php,配置其他的默认访问文件比如index.html这时候需要配置一下nginx才能访问到你想要设置的文件直接上代码,如下是我的配置的一份简单的nginx到php-fpm的站点,该站点默认访问目录/ecmob…
CMake 打包已经存在的动态库生成 target
一. 背景 在 CMakeLists.txt 中,某模块 A 通过 add_subdirectory 引入模块 B ,模块 B 通过 add_subdirectory 引入模块 C。模块 C 里面本身就是一个开源的动态库,比如 libtask。目的想要将 C 模块打包成一个 Target ,以便在 A 模…
Ruby: Ruby脚本在测试中的使用
如果存在以下的场景:1. 放置在公司的读报机服务器,每天都是开启的;2. 读报机每天下载报纸,一旦成功/失败,就会有相应的记录生成在某个xml文件中;3. 现在有过去一年的读报机下载xml,大约有200多份…
cocos2d-xna for win8源代码轻松移植cocos-xna for wp游戏
无意间看到杨哥弄了一个cocos2d-xna for win8出来可惜没有放出源代码,我试着要了一下结果他没理我,各种画圈圈。 那我只好自己弄一个了,源代码放出大家供交流学习使用,像杨哥说的一样就是一点小bug很容易该成把wp改成win8版的&…
Oct 2018
Tasks motion planning code in Autonomous DrivingUdacity RoboticsNDCoursera RoboticsMotion PlanningEstimationF1/10 racecarProject Overview 1. Mooc Udacity RoboticsND: project 3 Coursera Robotics Motion Planning HomeworkNote --> Post 2. Leetcode ☆☆ …
Springboot+mybatisplus搭建新闻管理系统
模块化实现,一周轻松搭建 前端 后端 项目源码及其教程回复已三连备注邮箱领取
SQL Server存储过程输入参数使用表值
在2008之前如果我们想要将表作为输入参数传递给SQL Server存储过程使比较困难的,可能需要很多的逻辑处理将这些表数据作为字符串或者XML传入。 在2008中提供了表值参数。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句…
ef core mysql 字符集,EF Core 基础知识
数据库连接字符串在 ASP.NET Core 添加配置片段:{"ConnectionStrings": {"BloggingDatabase": "Server(localdb)\\mssqllocaldb;DatabaseEFGetStarted.ConsoleApp.NewDb;Trusted_ConnectionTrue;"}}然后,配置对应的DbCont…
模板特化,全特化,偏特化,全部特化,部分特化的含义
模板特化,任何针对模板参数进一步进行条件限制设计的特化版本。《泛型思维》 全特化就是全部特化,即针对所有的模板参数进行特化。《c primer》偏特化就是部分特化,即针对部分模板参数进行特化。《c primer》全特化和偏特化的定义不是很严格&…
PHP中单例模式:三私一公是什么?
PHP中单例模式:三私一公是什么? 三私一公 私有化静态属性 私有化构造方法 私有化克隆方法 公有化静态方法 转载于:https://www.cnblogs.com/phpisfirst/p/9792545.html
php 缓存模块,PHP缓存之模块缓存(APC)_PHP教程
PHP缓存之模块缓存(APC)APC是Alternative PHP Cache的简称,是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。1、PHP配置APC开启APC模块,需要将 extensionphp_apc.dll 前面的注释去掉即…