本篇开始记录实现设计模式在工作中的两种常见语言上的实现。

本篇介绍最简单的工厂模式。

工厂模式有一种非常形象的描述,建立对象的类就如一个工厂,而需要被建立的对象就是一个个产品;在工厂中加工产品,使用产品的人,不用在乎产品是如何生产出来的。从软件开发的角度来说,这样就有效的降低了模块之间的耦合。

使用情景:

在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。

案例:

如果实现计算器的功能时,对于同样的输入数据,可能执行加、减、乘、除,甚至其他的功能。因此可以抽象出一个操作的抽象类或是接口,提供一个统一的处理方法(此处为process),然后每种操作创建出一个子类出来。而判断具体使用哪个具体的实现类是在工厂类中进行判断的(将存放操作的变量传递给工厂的生产方法)。工厂类始终返回的是这个抽象类,这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。

这样就做到了把耦合降到最低,同时也便于维护。

简单工厂:针对同样的数据,不同的操作用同一个接口

工厂方法:针对同样的数据,不同的操作用不同的接口

抽象工厂:针对不同的数据,不同的操作用不同的接口

一:简单工厂模式

1.简单工厂C++中的实现:

 #include <iostream>

 using namespace std;

 class ICarFactory{
public:
ICarFactory(){}
virtual ~ICarFactory(){}
virtual void produceCar() = ;
}; class CarFactoryBenz:public ICarFactory{
public:
void produceCar(){
cout<<"Produce a car of Benz"<<endl;
}
}; class CarFactoryVolkswagen: public ICarFactory{
public:
void produceCar(){
cout<<"Produce a car of Volkswagen"<<endl;
}
}; int main()
{
ICarFactory *car1 = new CarFactoryBenz();
ICarFactory *car2 = new CarFactoryVolkswagen();
car1->produceCar();
car2->produceCar();
return ;
}

2.简单工厂Java中的实现:

 public interface ICarFactory {
public void produceCar();
} public class FactoryBenz implements ICarFactory{ public void produceCar() {
System.out.println("Produce a car of Benz");
}
} public class FactoryToyota implements ICarFactory{
public void produceCar() {
System.out.println("Produce a car of Toyota");
}
} public class Main { public static void main(String[] args){
FactoryBenz factoryBenz = new FactoryBenz();
FactoryToyota factoryToyota = new FactoryToyota();
factoryBenz.produceCar();
factoryToyota.produceCar();
} }

:工厂方法模式

1.工厂方法模式在C++中的实现

核心思想:将工厂抽象出来,将产品抽象出来,子工厂负责new 子产品指针,返回抽象产品类指针,外面调用时只需要生成基类工厂指针,调用创建产品函数,就可以对该产品进行具体的操作,优点是能够将添加产品完全独立出来不再修改内部代码。

与简单工厂比较:修正了简单工厂模式中不遵循开放---封闭原则,例如添加新产品时仍需要修改工厂基类内容,工厂方法模式将判断移动到客户端实现。

 #include <iostream>

 using namespace std;

 class ICar{
public:
ICar(void){}
~ICar(void){}
virtual void printInfo() = ;
}; class CarBenz:public ICar{
public:
CarBenz(){}
~CarBenz(){}
void printInfo(){
cout<<"The brand is Benz"<<endl;
}
}; class CarToyota:public ICar{
public:
CarToyota(){}
~CarToyota(){}
void printInfo(){
cout<<"The brand is Toyota"<<endl;
}
}; class IFactory{
public:
IFactory(void){}
~IFactory(void){}
virtual ICar* produceCar() = ;
}; class FactoryBenz:public IFactory{
public:
FactoryBenz(){}
~FactoryBenz(){}
ICar* produceCar(){
cout<<"Produce a car of Benz"<<endl;
ICar* car = new CarBenz();
return car;
}
}; class FactoryToyota:public IFactory{
public:
FactoryToyota(){}
~FactoryToyota(){}
ICar* produceCar(){
cout<<"Produce a car of Toyota"<<endl;
ICar* car = new CarToyota();
return car;
}
}; int main()
{
IFactory* factory = new FactoryBenz();
ICar* car = factory->produceCar();
car->printInfo();
IFactory* factory2 = new FactoryToyota();
ICar* car2 = factory2 ->produceCar();
car2->printInfo();
return ;
}

输出:

Produce a car of Benz

The brand is Benz

Produce a car of Toyota

The brand is Toyota

2.工厂方法模式在Java中的实现

 public interface ICar {
void printInfo();
} public class CarBenz implements ICar { public void printInfo(){
System.out.println("The brand is Benz");
}
} public class CarToyota implements ICar{ public void printInfo(){
System.out.println("The brand is toyota");
} } public interface ICarFactory {
ICar produceCar();
} public class FactoryBenz implements ICarFactory{ public ICar produceCar(){
System.out.println("Produce a Benz car");
return new CarBenz();
}
} public class FactoryToyota implements ICarFactory{ public ICar produceCar(){
System.out.println("Produce a Toyota car");
return new CarToyota();
} } public class Main { public static void main(String[] args){
ICarFactory factoryBenz = new FactoryBenz();
ICarFactory factoryToyota = new FactoryToyota(); ICar benz = factoryBenz.produceCar();
ICar toyota = factoryToyota.produceCar(); benz.printInfo();
toyota.printInfo(); }
}

输出:

Produce a Benz car
Produce a Toyota car
The brand is Benz
The brand is toyota

:抽象工厂模式

1.C++实现抽象工厂

 #include <iostream>

 using namespace std;

 class ICarToyota{
public:
ICarToyota(){}
~ICarToyota(){}
virtual void printInfo() = ;
}; class CarToyotaChr:public ICarToyota{
public:
CarToyotaChr(){}
~CarToyotaChr(){}
void printInfo(){
cout<< "The car is Toyota C-HR"<<endl;
}
}; class CarToyotaCarolla:public ICarToyota{
public:
CarToyotaCarolla(){}
~CarToyotaCarolla(){}
void printInfo(){
cout<< "The car is Toyota Carolla"<<endl;
}
}; class ICarAudi{
public:
ICarAudi(){}
~ICarAudi(){}
virtual void printInfo()=;
}; class CarAudiA3:public ICarAudi{
public:
CarAudiA3(){}
~CarAudiA3(){}
void printInfo(){
cout<< "The car is audi a3"<<endl;
}
}; class CarAudiQ5:public ICarAudi{
public:
CarAudiQ5(){}
~CarAudiQ5(){}
void printInfo(){
cout<< "The car is audi q5"<<endl;
}
}; class IFactory{
public:
IFactory(){}
~IFactory(){}
virtual ICarToyota* produceCarToyota()=;
virtual ICarAudi* produceCarAudi()=;
}; class FactoryCompact:public IFactory{
public:
FactoryCompact(){}
~FactoryCompact(){}
ICarAudi* produceCarAudi(){
cout<<"Produce a audi compact car"<<endl;
return new CarAudiA3;
}
ICarToyota* produceCarToyota(){
cout<<"Produce a toyota compact car"<<endl;
return new CarToyotaCarolla;
}
}; class FactorySuv:public IFactory{
public:
FactorySuv(){}
~FactorySuv(){}
ICarAudi* produceCarAudi(){
cout<<"Produce a audi suv"<<endl;
return new CarAudiQ5;
}
ICarToyota* produceCarToyota(){
cout<<"Produce a toyota suv"<<endl;
return new CarToyotaChr;
}
}; int main()
{
FactoryCompact factory1;
FactorySuv factory2;
ICarAudi* audi1;
ICarAudi* audi2;
ICarToyota* toyota1;
ICarToyota* toyota2;
audi1 = factory1.produceCarAudi();
audi1->printInfo();
audi2 = factory2.produceCarAudi();
audi2->printInfo();
toyota1 = factory1.produceCarToyota();
toyota1->printInfo();
toyota2 = factory2.produceCarToyota();
toyota2->printInfo();
}

输出:

Produce a audi compact car

The car is audi a3

Produce a audi suv

The car is audi q5

Produce a toyota compact car

The car is Toyota Carolla

Produce a toyota suv

The car is Toyota C-HR

2.Java实现抽象工厂

 public interface ICarAudi {
void printInfo();
} public class CarAudiA3 implements ICarAudi {
public void printInfo() {
System.out.println("The car is Audi A3");
}
} public class CarAudiQ5 implements ICarAudi {
public void printInfo() {
System.out.println("The car is Audi Q5");
}
} public interface ICarToyota {
void printInfo();
} public class CarToyotaCarolla implements ICarToyota {
public void printInfo() {
System.out.println("The car is Toyota Carolla");
}
} public class CarToyotaChr implements ICarToyota {
public void printInfo() {
System.out.println("The vehicle is toyota C-HR");
}
} public interface IFactory {
ICarAudi produceAudi();
ICarToyota produceToyota();
} public class FactoryCompact implements IFactory {
public ICarAudi produceAudi() {
System.out.println("Produce an audi compact");
return new CarAudiA3();
} public ICarToyota produceToyota() {
System.out.println("Produce a toyota compact");
return new CarToyotaCarolla();
}
} public class FactoryCompact implements IFactory {
public ICarAudi produceAudi() {
System.out.println("Produce an audi compact");
return new CarAudiA3();
} public ICarToyota produceToyota() {
System.out.println("Produce a toyota compact");
return new CarToyotaCarolla();
}
} public class Main { public static void main(String[] args){
FactoryCompact factoryCompact = new FactoryCompact();
FactorySuv factorySuv = new FactorySuv();
ICarAudi c1 = factoryCompact.produceAudi();
c1.printInfo();
ICarAudi c2 = factorySuv.produceAudi();
c2.printInfo();
ICarToyota c3 = factoryCompact.produceToyota();
c3.printInfo();
ICarToyota c4 = factorySuv.produceToyota();
c4.printInfo();
} }

输出:

Produce an audi compact
The car is Audi A3
Produce an audi suv
The car is Audi Q5
Produce a toyota compact
The car is Toyota Carolla
Produce an Toyota suv
The vehicle is toyota C-HR

两种语言实现设计模式(C++和Java)(一:工厂模式)的更多相关文章

  1. 两种语言实现设计模式(C++和Java)(三:策略模式)

    策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化.也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异.用策略模式 ...

  2. 两种语言实现设计模式(C++和Java)(二:单例模式)

    本篇介绍单例模式,可以说是使用场景最频繁的设计模式了.可以根据实例的生成时间,分为饿汉模式和懒汉模式 懒汉模式:饿了肯定要饥不择食.所以在单例类定义的时候就进行实例化. 饿汉模式:故名思义,不到万不得 ...

  3. 两种语言实现设计模式(C++和Java)(四:适配器模式)

    参考:http://blog.jobbole.com/109381/ 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 系统的数 ...

  4. C#设计模式(3)——抽象工厂模式

    1.抽象工厂模式介绍 上一篇我们了解了工厂模式,知道工厂模式可以解决简单工厂的缺陷(简单工厂添加新产品时要修改工厂类,不符合开闭原则),但是简单工厂和工厂模式都是只生产一种产品(前边的简单工厂和工厂都 ...

  5. Java设计模式(三) 抽象工厂模式

    原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...

  6. Java设计模式(一) 简单工厂模式不简单

    摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...

  7. Java设计模式之(二)——工厂模式

    1.什么是工厂模式 Define an interface for creating an object,but let subclasses decide which class toinstant ...

  8. java 深入浅出工厂模式

    一.引子 话说十年前,有一个暴发户,他家有三辆汽车——Benz奔驰.Bmw宝马.Audi奥迪,还雇了司机为他开车.不过,暴发户坐车时总是怪怪的:上Benz车后跟司机说“开奔驰车!”,坐上Bmw后他说“ ...

  9. !!转!!java 简单工厂模式

    举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就是 ...

随机推荐

  1. React文档(二十四)高阶组件

    高阶组件(HOC)是React里的高级技术为了应对重用组件的逻辑.HOCs本质上不是React API的一部分.它是从React的组合性质中显露出来的模式. 具体来说,一个高阶组件就是一个获取一个组件 ...

  2. 第七届 蓝桥杯 方格填数 dfs

    如下的10个格子  填入0~9的数字.要求:连续的两个数字不能相邻. (左右.上下.对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数. 注意:你提交的应该是一个整数,不要填写任何 ...

  3. vscode相关配置

    一.插件 二.首先项设置: { "git.enableSmartCommit": true, "gitlens.advanced.messages": { &q ...

  4. composer 自动加载(php-amqplib)

    最近要使用RabbitMQ 做消息队列,也是刚接触到.因为用的的TP框架,comoser又下载不下来,所以只能手动下载拓展包,做手动加载,在php-amqplib是我手动下载下来的拓展包,创建一个co ...

  5. Fortran程序调试中的“吐核”错误

    在CentOS7上安装了PGI编译器,但是调试过程中遇到的“段错误(吐核)”一直让人很头疼. 通常采用在程序中增加屏幕输出代码的方式来追踪和定位出错的变量,比如下面这个样例程序就在第16行和第18行增 ...

  6. css布局:左边固定宽度,右边自适应;右边固定宽度,左边自适应

    左边固定宽度,右边自适应 浮动布局的方法 <section class="container homeSection" id="mainSection"& ...

  7. PHP语言学习之php-fpm 三种运行模式

    本文主要向大家介绍了PHP语言学习之php-fpm 三种运行模式,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的 ...

  8. Android直接用手机打包apk!

      你没有看错,用手机浏览器访问Jenkins,就可以打包apk,并生成下载二维码,发送邮件通知测试人员下载,从此解放双手,告别打包测试.先上本人手机邮箱收到的打包成功通知效果图:     废话少说, ...

  9. svn 删除svn项目命令

    svn delete svn://127.0.0.1:3690/project -m delete

  10. git版本控制系统更新

    版本控制系统: 一.概念: 版本控制系统(Version Control System):是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 二.版本控制系统分类 1.本地版本控制 ...