设计模式之-----工厂模式

可以这么解释工厂模式:将创建对象的任务专职于一种类,用这种类来创建对象(产品对象),对于用户(要创建对象的人)来说,只要调用工厂类的相应方法便能得到所要的实例。

好处是隐藏了创建对象的细节。

说到工厂,有简单工厂模式,工厂模式,抽象工厂模式。

1简单工厂一语带过:通过传入参数来决定执行简单工厂类中的某条条new语句,并将获得的对象返回。(不属于23种设计模式)

2工厂模式:新增产品类型时,简单工厂需要改变其中代码,这不符合开闭原则,而工厂模式可以避免这个问题。

工厂模式中,为每一个产品类创建一个对应的具体工厂。

一图胜千言,先上类图。


从图上看:首先产品类和工厂类都有自己的抽象,然后每个产品类都有自己对应的工厂类。这样在增加一个产品是只需要增加一个对应的工厂类就可以了。(符合开闭原则)

3、抽象工厂模式

抽象工厂是针对更加复杂的产品组成所产生的一种工厂模式。介绍抽象工厂模式之前先来了解一个概念:产品族产品等级结构

举例子说:产品族就是奔驰汽车厂生产的S SLK ML G C A B 级别的汽车的集合。产品等级结构指:奔驰生产的ML越野车,宝马生产的X5越野车,保时捷生产的卡宴的集合。

从上面例子就可以看出,抽象工厂要生产自己的产品族,而生产出来的产品是属于产品等级结构中的。

一图胜千言,先上类图。


可以看出图中有一个抽象工厂和对应的两个具体工厂。有两个抽象产品类和它们对应的产品。很明显可以看出,有产品等级结构A和B。不过图中没有标出的是:Factory1和Factory2都有各自的生产A,B产品的方法。

再来一段代码读者应该就能完全理解了。

产品类的结构

abstract class Connection
{
	public void connect();
	
}
class OracleConnection extends Connection
{
	public void connect()
	{
		System.out.println("链接oracle数据库");
		}
}
class MysqlConnection extends Connection
{
	public void connect()
	{
		System.out.println("链接Mysql数据库");
		}
}
abstract class Statement
{
	public void statement();
	
}
class OracleStatement extends Statement
{
	public void statement()
	{
		System.out.println("执行oracle语句");
		}
}
class MysqlStatement extends Statement
{
	public void statement()
	{
		System.out.println("执行Mysql语句");
		}
}
两种产品结构:connection和Statement.  分别有对应的oracle和mysql类型产品。

以下是工厂类结构

abstract class DBFactory 
{
	public Connection createConnection();
	public Statement createStatement();
}
class OracleFactory extends DBFactory
{
	public Connection createConnection()
	{
		return new OracleConnection();
		
	}
	public Statement createStatement()
	{
		return new OracleStatement();
	}
}
class MysqlFactory extends DBFactory
{
	public Connection createConnection()
	{
		return new MysqlConnection();
	}
	public Statement creatStatement()
	{
		return new MysqlStatement();
	}
}

抽象工厂和具体的mysql与oracle工厂。

客户代码

	public static void main(String args[])
	{
		DBFactory factory;
		Connection connection;
		Statement statement;
		factory=new OracleFactory();
		connection=factory.createConnection();
		statement=factory.createStatement();
		connection.connect();
		statement.statement();
		
	}

从客户代码就可以看出,客户需要connection对象和statement对象,但他没有指名其具体类型,它们的类型是在创建了具体的工厂对象OracleFactory并调用它的creat()方法后确定的。这也就是抽象工厂叫“抽象”的原因------》允许用户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样,客户就从具体的产品中解耦。

抽象工厂模式的好处是:同一产品等级下的产品是由不同工厂产生的,所以能够实现这一等级下产品的差异化。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值