Factory 工厂模式

概述

Factory工厂模式是最常用的设计模式之一,它提供了一种创建对象的最佳方式
在工厂模式中,我们在创建对象时不会对用户暴露逻辑,而是通过使用一个共同的接口来指向新创建的对象。



简单工厂

定义

简单工厂模式是工厂模式中最简单的一种,它用比较简单的方式来隐藏创建对象的细节,对修改不封闭,新增产品就需要修改工厂,不符合开闭原则。

结构

该模式包含的角色有:工厂角色、抽象产品角色、具体产品角色,类图如下:
在这里插入图片描述

示例程序

#include <iostream>
using namespace std;

/* 定义手机类型 */
enum PRODUCTTYPE { OPPO, VIVO, HUAWEI };

/* 抽象产品phone */
class phoneBase
{
public:
	virtual ~phoneBase() {};
	virtual void show() = 0;
};

/* OPPO具体产品phone */
class OPPOPhone :public phoneBase
{
public:
	void show() { cout << "OPPO Phone" << endl; }
};

/* VIVO具体产品phone */
class VIVOPhone :public phoneBase
{
public:
	void show() { cout << "VIVO Phone" << endl; }
};

/* HUAWEI具体产品phone */
class HUAWEIPhone :public phoneBase
{
public:
	void show() { cout << "HUAWEI Phone" << endl; }
};

/* 手机工厂 */
class Factory
{
public:
	/* 根据相应的类型进行生产 */
	phoneBase* createPhone(PRODUCTTYPE type)
	{
		switch (type)
		{
		case OPPO:
			return new OPPOPhone(); // 生产OPPO手机
			break;
		case VIVO:
			return new VIVOPhone(); // 生产VIVO手机
			break;
		case HUAWEI:
			return new HUAWEIPhone(); // 生产HUAWEI手机
			break;
		default:break;
		}

	}
};

int main()
{
	Factory factory;

	phoneBase* p1 = factory.createPhone(OPPO);
	p1->show();
	phoneBase* p2 = factory.createPhone(VIVO);
	p2->show();
	phoneBase* p3 = factory.createPhone(HUAWEI);
	p3->show();

	delete p1;
	delete p2;
	delete p3;
	return 0;
}



工厂方法

定义

工厂方法模式定义了一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中

这样一来,核心类就是这个抽象工厂角色,它仅负责具体工厂子类必须实现的产品创建接口。这样进一步抽象化的好处是:使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引入新产品;

其完全实现开闭原则,实现了可扩展。

结构

该模式包含的角色有:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色,类图如下:
在这里插入图片描述

示例程序

// 工厂方法
#include <iostream>
using namespace std;

/* 定义手机类型 */
enum PRODUCTTYPE { OPPO, VIVO, HUAWEI };

/* 抽象产品phone */
class phoneBase
{
public:
	virtual ~phoneBase() {};
	virtual void show() = 0;
};
/* OPPO具体产品phone */
class OPPOPhone :public phoneBase
{
public:
	void show() { cout << "OPPO Phone" << endl; }
};

/* VIVO具体产品phone */
class VIVOPhone :public phoneBase
{
public:
	void show() { cout << "VIVO Phone" << endl; }
};

/* HUAWEI具体产品phone */
class HUAWEIPhone :public phoneBase
{
public:
	void show() { cout << "HUAWEI Phone" << endl; }
};

/* 抽象工厂 */
class Factory
{
public:
	/* 提供抽象生产接口,由各个具体工厂实现 */
	virtual phoneBase* createPhone() = 0;
};

/* OPPO工厂 —— 专门负责生产OPPO手机 */
class OPPOFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new OPPOPhone();
	}
};

/* VIVO工厂 —— 专门负责生产VIVO手机 */
class VIVOFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new VIVOPhone();
	}
};

/* HUAWEI工厂 —— 专门负责生产HUAWEI手机 */
class HUAWEIFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new HUAWEIPhone();
	}
};


int main()
{
	OPPOFactory Ofactory;
	phoneBase* p1 = Ofactory.createPhone();
	p1->show();

	VIVOFactory Vfactory;
	phoneBase* p2 = Vfactory.createPhone();
	p2->show();

	HUAWEIFactory Hfactory;
	phoneBase* p3 = Hfactory.createPhone();
	p3->show();

	delete p1;
	delete p2;
	delete p3;
	return 0;
}



抽象工厂

定义

前面介绍的工厂方法模式只考虑一类产品的的生产,也就是说:工厂方法模式只考虑生产同等级的产品,但是实际应用场景下大多数是综合型的工厂,能够生产多等级的产品,比如说手机厂商不仅能生产手机,还能生产各种配件、芯片等;

抽象工厂模式除了具有工厂方法模式的优点外,其它主要优点如下:

  • 可以在类内对产品族中相关联的多等级产品共同管理,而不必引入多个新类进行管理;
  • 增加一个新的产品族时,不需要修改源代码,满足开闭原则。

缺点是:当产品族中需要增加一个新产品时,所有的工厂类都需要进行修改。

结构

该模式包含的角色有:抽象工厂角色、具体工厂角色、抽象产品角色、具体产品角色,类图如下:
在这里插入图片描述

示例程序

// 抽象工厂
#include <iostream>
using namespace std;

/* 定义手机类型 */
enum PRODUCTTYPE { OPPO, VIVO, HUAWEI };

/* 定义其他产品类型:芯片、配件 */
enum OTHERTYPE { IC, CASE }; 

/* 定义抽象产品phone */
class phoneBase
{
public:
	virtual ~phoneBase() {};
	virtual void show() = 0;
};

/* OPPO具体产品phone */
class OPPOPhone :public phoneBase
{
public:
	void show() { cout << "OPPO Phone" << endl; }
};

/* VIVO具体产品phone */
class VIVOPhone :public phoneBase
{
public:
	void show() { cout << "VIVO Phone" << endl; }
};

/* HUAWEI具体产品phone */
class HUAWEIPhone :public phoneBase
{
public:
	void show() { cout << "HUAWEI Phone" << endl; }
};

/* 定义抽象产品OTHER */
class OTHERBase
{
public:
	virtual ~OTHERBase() {};
	virtual void show() = 0;
};

/* OPPO具体产品OTHER */
class OPPOOTHER :public OTHERBase
{
public:
	void show() { cout << "OPPO OTHER PRODUCT" << endl; }
};

/* VIVO具体产品OTHER */
class VIVOOTHER :public OTHERBase
{
public:
	void show() { cout << "VIVO OTHER PRODUCT" << endl; }
};

/* HUAWEI具体产品OTHER */
class HUAWEIOTHER :public OTHERBase
{
public:
	void show() { cout << "HUAWEI OTHER PRODUCT" << endl; }
};

/* 抽象工厂 : 提供了产品的生成方法。 */
class Factory
{
public:
	virtual phoneBase* createPhone() = 0;
	virtual OTHERBase* createOther() = 0;
};

/* OPPO具体工厂:实现了OPPO产品族的生成方法。 */
class OPPOFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new OPPOPhone();
	}

	OTHERBase* createOther()
	{
		return new OPPOOTHER();
	}
};

/* VIVO具体工厂:实现了VIVO产品族的生成方法。 */
class VIVOFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new VIVOPhone();
	}

	OTHERBase* createOther()
	{
		return new VIVOOTHER();
	}
};

/* HUAWEI具体工厂:实现了HUAWEI产品族的生成方法。 */
class HUAWEIFactory : public Factory
{
public:
	phoneBase* createPhone()
	{
		return new HUAWEIPhone();
	}

	OTHERBase* createOther()
	{
		return new HUAWEIOTHER();
	}
};


int main()
{
	OPPOFactory Ofactory;
	phoneBase* p1 = Ofactory.createPhone();
	OTHERBase* p2 = Ofactory.createOther();
	p1->show();
	p2->show();

	VIVOFactory Vfactory;
	phoneBase* p3 = Vfactory.createPhone();
	OTHERBase* p4 = Vfactory.createOther();
	p3->show();
	p4->show();

	HUAWEIFactory Hfactory;
	phoneBase* p5 = Hfactory.createPhone();
	OTHERBase* p6 = Hfactory.createOther();
	p5->show();
	p6->show();

	delete p1;
	delete p2;
	delete p3;
	delete p4;
	delete p5;
	delete p6;
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Page Factory是Selenium WebDriver的一个扩展,它提供了一种用于管理页面对象的工厂模式。在测试过程中,我们需要与页面交互,这意味着我们需要操作页面上的各种元素(如文本框、按钮、下拉列表等)。为了使测试代码更可维护、可读性更好,我们可以使用Page Factory来管理页面对象。 Page Factory使用注解的方式来初始化页面对象,这些对象可以直接通过测试类的成员变量访问。这使得代码更加简洁、易于维护。 下面是一个示例: ```java public class LoginPage { @FindBy(id = "username") private WebElement usernameInput; @FindBy(id = "password") private WebElement passwordInput; @FindBy(id = "loginButton") private WebElement loginButton; public void login(String username, String password) { usernameInput.sendKeys(username); passwordInput.sendKeys(password); loginButton.click(); } } ``` 在上面的代码中,我们使用了`@FindBy`注解来初始化页面元素对象。这些对象可以直接通过类的成员变量来访问。 在测试代码中,我们可以像下面这样使用LoginPage: ```java public class LoginTest { private WebDriver driver; private LoginPage loginPage; @BeforeTest public void setup() { driver = new ChromeDriver(); loginPage = PageFactory.initElements(driver, LoginPage.class); } @Test public void testLogin() { loginPage.login("username", "password"); } @AfterTest public void teardown() { driver.quit(); } } ``` 在上面的测试代码中,我们使用了`PageFactory.initElements`方法来初始化LoginPage对象。这个方法会自动查找LoginPage中使用`@FindBy`注解的成员变量,并将它们初始化为页面元素对象。 使用Page Factory可以使测试代码更加简洁、易于维护。它提供了一个优雅的方式来管理页面对象。如果你使用Selenium WebDriver进行自动化测试,建议你尝试使用Page Factory

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值