可以这么解释工厂模式:将创建对象的任务专职于一种类,用这种类来创建对象(产品对象),对于用户(要创建对象的人)来说,只要调用工厂类的相应方法便能得到所要的实例。
好处是隐藏了创建对象的细节。
说到工厂,有简单工厂模式,工厂模式,抽象工厂模式。
1简单工厂一语带过:通过传入参数来决定执行简单工厂类中的某条条new语句,并将获得的对象返回。(不属于23种设计模式)
2工厂模式:新增产品类型时,简单工厂需要改变其中代码,这不符合开闭原则,而工厂模式可以避免这个问题。
工厂模式中,为每一个产品类创建一个对应的具体工厂。
一图胜千言,先上类图。
从图上看:首先产品类和工厂类都有自己的抽象,然后每个产品类都有自己对应的工厂类。这样在增加一个产品是只需要增加一个对应的工厂类就可以了。(符合开闭原则)
3、抽象工厂模式
抽象工厂是针对更加复杂的产品组成所产生的一种工厂模式。介绍抽象工厂模式之前先来了解一个概念:产品族 与 产品等级结构。
举例子说:产品族就是奔驰汽车厂生产的S SLK ML G C A B 级别的汽车的集合。产品等级结构指:奔驰生产的ML越野车,宝马生产的X5越野车,保时捷生产的卡宴的集合。
从上面例子就可以看出,抽象工厂要生产自己的产品族,而生产出来的产品是属于产品等级结构中的。
一图胜千言,先上类图。
再来一段代码读者应该就能完全理解了。
产品类的结构
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()方法后确定的。这也就是抽象工厂叫“抽象”的原因------》它允许用户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么。这样,客户就从具体的产品中解耦。
抽象工厂模式的好处是:同一产品等级下的产品是由不同工厂产生的,所以能够实现这一等级下产品的差异化。