工厂方法模式

武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制 武汉大学朱玉贤院士团队再发Nature Genetics,阐述棉花独特折叠胚胎形成的分子调控与演化机制。 阅读详情

作者:卡奴达摩

链接:http://blog.youkuaiyun.com/zhengzhb/article/details/7348707

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。

类型:创建类模式

类图:

工厂方法模式代码

interface IProduct {  
    public void productMethod();  
}  
  
class Product implements IProduct {  
    public void productMethod() {  
        System.out.println("产品");  
    }  
}  
  
interface IFactory {  
    public IProduct createProduct();  
}  
  
class Factory implements IFactory {  
    public IProduct createProduct() {  
        return new Product();  
    }  
}  
  
public class Client {  
    public static void main(String[] args) {  
        IFactory factory = new Factory();  
        IProduct prodect = factory.createProduct();  
        prodect.productMethod();  
    }  
} 




工厂模式:

        首先需要说一下工厂模式。工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经常用到的一种模式。它的主要优点有:

  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
  • 对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。

 

工厂方法模式:

       通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:

  • 工厂接口。工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。在实际编程中,有时候也会使用一个抽象类来作为与调用者交互的接口,其本质上是一样的。
  • 工厂实现。在编程中,工厂实现决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的工厂实现。
  • 产品接口。产品接口的主要目的是定义产品的规范,所有的产品实现都必须遵循产品接口定义的规范。产品接口是调用者最为关心的,产品接口定义的优劣直接决定了调用者代码的稳定性。同样,产品接口也可以用抽象类来代替,但要注意最好不要违反里氏替换原则。
  • 产品实现。实现产品接口的具体类,决定了产品在客户端中的具体行为。

        前文提到的简单工厂模式跟工厂方法模式极为相似,区别是:简单工厂只有三个要素,他没有工厂接口,并且得到产品的方法一般是静态的。因为没有工厂接口,所以在工厂实现的扩展性方面稍弱,可以算所工厂方法模式的简化版,关于简单工厂模式,在此一笔带过。

      

适用场景:

        不管是简单工厂模式,工厂方法模式还是抽象工厂模式,他们具有类似的特性,所以他们的适用场景也是类似的。

        首先,作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过new就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。

       其次,工厂模式是一种典型的解耦模式,迪米特法则在工厂模式中表现的尤为明显。假如调用者自己组装产品需要增加依赖关系时,可以考虑使用工厂模式。将会大大降低对象之间的耦合度。

       再次,由于工厂模式是依靠抽象架构的,它把实例化产品的任务交由实现类完成,扩展性比较好。也就是说,当需要系统有比较好的扩展性时,可以考虑工厂模式,不同的产品用不同的实现工厂来组装。

      

典型应用

       要说明工厂模式的优点,可能没有比组装汽车更合适的例子了。场景是这样的:汽车由发动机、轮、底盘组成,现在需要组装一辆车交给调用者。假如不使用工厂模式,代码如下:

[java]  view plain  copy
  1. class Engine {  
  2.     public void getStyle(){  
  3.         System.out.println("这是汽车的发动机");  
  4.     }  
  5. }  
  6. class Underpan {  
  7.     public void getStyle(){  
  8.         System.out.println("这是汽车的底盘");  
  9.     }  
  10. }  
  11. class Wheel {  
  12.     public void getStyle(){  
  13.         System.out.println("这是汽车的轮胎");  
  14.     }  
  15. }  
  16. public class Client {  
  17.     public static void main(String[] args) {  
  18.         Engine engine = new Engine();  
  19.         Underpan underpan = new Underpan();  
  20.         Wheel wheel = new Wheel();  
  21.         ICar car = new Car(underpan, wheel, engine);  
  22.         car.show();  
  23.     }  
  24. }  


        可以看到,调用者为了组装汽车还需要另外实例化发动机、底盘和轮胎,而这些汽车的组件是与调用者无关的,严重违反了迪米特法则,耦合度太高。并且非常不利于扩展。另外,本例中发动机、底盘和轮胎还是比较具体的,在实际应用中,可能这些产品的组件也都是抽象的,调用者根本不知道怎样组装产品。假如使用工厂方法的话,整个架构就显得清晰了许多。

[java]  view plain  copy
  1. interface IFactory {  
  2.     public ICar createCar();  
  3. }  
  4. class Factory implements IFactory {  
  5.     public ICar createCar() {  
  6.         Engine engine = new Engine();  
  7.         Underpan underpan = new Underpan();  
  8.         Wheel wheel = new Wheel();  
  9.         ICar car = new Car(underpan, wheel, engine);  
  10.         return car;  
  11.     }  
  12. }  
  13. public class Client {  
  14.     public static void main(String[] args) {  
  15.         IFactory factory = new Factory();  
  16.         ICar car = factory.createCar();  
  17.         car.show();  
  18.     }  
  19. }  

        使用工厂方法后,调用端的耦合度大大降低了。并且对于工厂来说,是可以扩展的,以后如果想组装其他的汽车,只需要再增加一个工厂类的实现就可以。无论是灵活性还是稳定性都得到了极大的提高。


、、、、、、转者、、、、、


#include <iostream>
#include <string>

/**************简单工厂(静态工厂)*****************
静态工厂不是一种设计模式,它将代码中容易变化的部分与
不容易变化的部分分离开来,将容易变化的部分集中到一个
方法中,方法给客户端提供一个接口,客户端不知道也不用
关心产品对象的具体类型,做到了松耦合。
************************************************/
class car
{
private:
	std::string CarName;
public:
	explicit car(std::string name) : CarName(name)
	{
	}
	virtual void run() = 0;
	std::string getname()
	{
		return CarName;
	}
	virtual ~car(){};
};

class Lexus : public car
{
public:
	Lexus(std::string name) : car(name)
	{
	}
	void run()
	{
		std::cout << getname() + " run" << std::endl;
	}
};

class Subaru : public car
{
public:
	Subaru(std::string name) : car(name)
	{
	}
	void run()
	{
		std::cout << getname() + " run" << std::endl;
	}
};

class Mitsubishi : public car
{
public :
	Mitsubishi(std::string name) : car(name)
	{
	}
	void run()
	{
		std::cout << getname() + " run" << std::endl;
	}
};


class StaticFactory
{
public:
	static car* CreateCar(std::string name)
	{
		car *carType = NULL;

		if( name == "Lexus" )
		{
			carType = new Lexus(name);
		}
		else if( name == "Subaru" )
		{
			carType = new Subaru(name);
		}
		else if( name == "Mitsubishi" )
		{
			carType = new Mitsubishi(name);
		}

		return carType;
	}
};

/******************工厂方法*******************
工厂方法模式, 提供一个创建产品的方法接口,在子类
中实现创建产品的方法并真正创建产品,其将产品的实例
化推迟到了子类。
也就是说,也就是说可以在需要的时候才去继承工厂并实
例化产品,要创建产品只需要继承并实现创建产品的方法
即可,和简单工厂一样,工厂方法也做到了松耦合
********************************************/
class Transportation
{
private:
	std::string Name;

public:
	explicit Transportation(std::string name) : Name(name)
	{
	}
	virtual void move() = 0;
	std::string getname()
	{
		return Name;
	}
	virtual ~Transportation(){};
};

class Train : public Transportation
{
public:
	explicit Train(std::string name) : Transportation(name)
	{
	}
	void move()
	{
		std::cout << "Move on the rail" << std::endl;
	}
};

class Airplane : public Transportation
{
public:
	explicit Airplane(std::string name) : Transportation(name)
	{
	}
	void move()
	{
		std::cout << "Fly in the sky" << std::endl;
	}
};

class Boat : public Transportation
{
public:
	explicit Boat(std::string name) : Transportation(name)
	{
	}
	void move()
	{
		std::cout << "Float on the water" << std::endl;
	}
};

class IFactory
{
public:
	virtual Transportation *CreateTransportation() = 0;
};

class TrainFactory : public IFactory
{
public:
	virtual Transportation *CreateTransportation()
	{
		return new Train("Train");
	}
};

class AirplaneFactory : public IFactory
{
public:
	virtual Transportation *CreateTransportation()
	{
		return new Airplane("Airplane");
	}
};

class BoatFactory : public IFactory
{
public:
	virtual Transportation *CreateTransportation()
	{
		return new Boat("Boat");
	}
};

int main(int argc, char **argv)
{
	car *car = StaticFactory::CreateCar("Subaru");		
	if( NULL != car )
		car->run();

	IFactory *factory = new TrainFactory();				//创建火车工厂,如果以后要创建轮船,只需要将此处替换为BoatFactory即可
	if( NULL == factory )
		return -1;

	Transportation *transportation = factory->CreateTransportation();
	if( NULL != transportation ) 
	{
		transportation->getname();
		transportation->move();
	}

	delete car;
	delete factory;
	delete transportation;

	system("pause");
	return 0;
}






42、使用mmrotate中k3det进行旋转目标检测,并进行mnn部署和ncnn部署 基本思想:仍然是身份证分割,并进行ncnn和mnn的c++的部署开发 阅读详情

相关推荐

关于图像傅里叶变换得到的频谱图的通俗理解

傅里叶变换过程: 经过傅里叶变化且频谱居中化处理的频谱图: 1.如果将图像某一行上的灰度变化看作是一个离散信号,那么整张图像可以看作是一个分布在二维平面上的信号,因此图像可看作是空间域信号。傅里叶变换则是将图像灰度分布(空间域信号)变换到了频域上,给我们提供了观察图像的另一个视角。 2.图像的频谱图(频谱居中后)的中心点是频率最低点,以该点为圆心,不同半径的上的点表示不同的频率。这里的图像频率是指对应原图像中的某灰度曲线变化的快慢(这么说不严谨,但是按照上面第1点的角度,似乎也可以这么理解

daimashiren的博客 2万+

创建型模式(一):工厂方法模式(含简单工厂模式)

工厂方法(FactoryMethod)模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典[设计模式],它的缺点是增加新产品时会违背“开闭原则”。

kayyoo的博客 2421

【SEED Labs 2.0】V*N Tunneling Lab

本文为 SEED Labs 2.0 - V*N Tunneling Lab 的实验记录。本实验工作量较大,但难度不大,重点在于搞清是谁发给谁,走的什么路径。另外,本次实验由于网络中的设备较多,修改了环境变量方便分清哪个窗口是哪个设备。这样操作起来就方便多了。...

Chenyang的博客 6977

工厂方法模式(简单工厂模式)

工厂模式是一种创建型设计模式,用于创建对象。它的主要目的是通过将从代码中抽象出来,从而使代码更加灵活和可维护。通过使用工厂模式,我们可以避免在代码中直接实例化对象,而是将对象创建的任务委托给一个专门的工厂类来处理。在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的。

qq_53868937的博客 694

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

通过TMS320F28335学习DSP的开发流程——28335的基础知识(1)

1、TMS320F28335内核的主要特点 ①F28335 DSP集成了DSP和微控制器的长处,如DSP的主要特征、单周期乘法运算,F28335能够在一个周期内完成32x32位的乘法累加运算,或者两个16x16位乘法累加运算,而同样32位的普通单片机则需要4个周期以上才能完成 ②快速的中断响应 ③可在任何内存位置进行单周期读、修改、写操作 ④可采用C/C++编程软件,效率非常高 2、处理器的主要资源 ①32位浮点DSP,主频是150MHz,方便电机控制、电力设备控制及工业控制等。 ②片上存储器:FLASH–

Kayboy的博客 2万+

设计模式(2):工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。 类型:创建类模式 类图: 工厂方法模式代码 [java]view plaincopy interfaceIProduct{ publicvoidproductMethod(); } classProduc...

weixin_30552811的博客 777

基于wxWidgets框架,使用DialogBlocks建立OpenGL界面

前言 之前公司要求使用wxWidgets做GUI,基于OpenGL图形内核,开发三维可视化工具。目前初步开发工作基本已经完成,剩下都是完善了。这里记录一下最开始的框架搭建过程(当然是简化版啦)。wxWidgets结合OpenGL开发可以实现跨平台应用,再结合CMake和VS Code,整体开发工具用习惯了会感觉非常顺手。 界面编辑 首先,使用DialogBlocks新建一个工程,这里工程目录...

cyberobot的博客 2750

C++设计模式

文章目录简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式有一个工厂,可以生产多个产品,包含两个接口,一个是产品类的,一个是工厂类的。 产品类需要有一个基类,基类中的具体产品实现需要是个纯虚函数,这样一来,产品的子类必须要重写具体的产品实现,实现不同的功能。 产品类封装完成后,还需要一个工厂类,工厂类对产品类再次封装,最终实现由一个工厂对象决定创建出哪一种产品类的实例。 //简单工厂模式 #include<iostream> using namespace std; #defin

xnxygxp的博客 1158

Leads、SDR、MQL、SQL、L2C术语概念,线索创建与清洗、线索分级模型、线索流转策略、线索的统计与分析

CRM中的“Leads”是什么?笔者在文中不仅较为全面地介绍了相关术语概念,还分析了线索的创建与清洗、线索的分级模型、线索流转策略以及线索的统计与分析。

盼盼学士 5960

MTK AWB 色温曲线的进一步猜想

平均距离来判断是否对该色温下白平衡进行全部收白处理,还是保留一些光源的本身的颜色。比如占据图像一大半左右的纯色背景,纵坐标值相对横坐标的距离应该会比较大,大于一般场景下的正常白点分布。反之,位于Plank_curve下方位置的点具有偏洋红色的倾向。此时拟合各个色温下的白点,拟合曲线大致是以X= 0.85)平行于横轴的一条直线。对原始坐标系中的点取对数后的Log坐标系空间。此时拟合各个色温下的白点,拟合曲线大致呈现的是一条直线。,可以认为是各种色温下白点分布所呈现的走向。的算法利用某个色温点的偏离。

大熊 722

设计模式:工厂方法模式(Factory Method)

工厂方法模式是一种。

2501_90825385的博客 1450

从0到1打造一台机器人走起来

1)本体机械结构设计,依据人体生物学和生物力学知识,结合机器人运动时各关节扭矩需求,进行合理选用电机,比如胯部需要大扭矩,腿部惯量小等2)硬件拓扑上,分层架构的信号层和功率协同工作,高带宽,低延时,硬实时3)步态规划设计与验证环节实机回溯和部署过程:Real2Sim,Sim2Sim,Sim2Real。

weixin_43163941的博客 244

Python 工厂方法模式

今日分享主题:Python 工厂方法模式 工厂,大家一般能想到的是生产产品的地方,在设计模式中,工厂可分为:简单工厂模式、工厂方法模式。在前期推文Python 简单工厂模式中有关于简单工厂模式的解读。 根据工厂的抽象程度可分为:工厂方法模式、抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。 背景 在简单工厂模式中,只提供了一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。 简单工厂模式最大的缺点是:当有新产...

Python+大数据+数据分析+自动化+Vue组件开发 449

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

工厂方法模式_工厂方法模式

定义与特点工厂方法模式(FactoryMethod),定义一个创建产品对象的工厂接口,让工厂子类决定实例化那一个产品类。工厂方法使一个类的实例化延迟到其子类。我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”,它不属于 GoF 的 23 种经典设计模式,它的缺点是增加新产品时会违背“开闭原则”(可以通过...

weixin_39710249的博客 195

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 策略模式
下一篇: 抽象工厂模式
早起的虫儿灬
博客等级 码龄10年 54粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值