工厂模式有三种,简单工厂,工厂模式和抽象工厂模式,严格来说简单工厂模式不算是一种设计模式。它们的主要作用就是根据不同的条件来产生不同的对象,而不需要大量的去new对象。这次先了解一下简单工厂和工厂模式。
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jave论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。
涉及到四个角色:
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。
何时使用:需要根据不同条件创建不同实例时。
应用实例:1、您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现。2、Hibernate 换数据库只需换方言和驱动就可以。
优点:1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3、屏蔽产品的具体实现,调用者只关心产品的抽象类或者接口。
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
使用场景:1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
注意事项:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度。
一般业务不是很复杂时,可以建立简单工厂模式,如果业务比较复杂,对扩展性要求更多的时候,可以建立工厂模式的代码。下边是用PHP写的一个数据库连接简单工厂:
<?php
//创建抽象类
abstract class DbConnection{
abstract public function Connection();
}
//创建继承抽象类的实体类MSSQL/MySql/Oracle
class MSSqlConnection extends DbConnection{
function Connection()
{
echo 'MSSql Connection.';
}
}
class MySqlConnection extends DbConnection{
function Connection()
{
echo 'MySql Connection.';
}
}
class OracleConnection extends DbConnection{
function Connection()
{
echo 'Oracle Connection.';
}
}
//创建一个工厂,生成基于给定信息的实体类的对象
class ConnectionFactory{
public static function GetConnection($DbType)
{
switch ($DbType) {
case 'MSSql' :
return new MSSqlConnection ();
break;
case 'MySql' :
return new MySqlConnection ();
break;
case 'Oracle' :
return new OracleConnection ();
break;
}
}
}
//根据传入的值来生成不同的对象,并使用各自的方法
$Connection = ConnectionFactory::GetConnection('Oracle');
$Connection->Connection();
?>
上边的时一个简单工厂的例子,简单工厂模式适用于业务简单的情况下或者具体产品很少增加的情况。而对于复杂的业务环境可能不太适应了。这时候就需要工厂模式,下边的代码是工厂模式:
<?php
//创建抽象类
abstract class DbConnection{
abstract public function Connection();
}
//创建继承抽象类的实体类MSSQL/MySql/Oracle
class MSSqlConnection extends DbConnection{
function Connection()
{
echo 'MSSql Connection.';
}
}
class MySqlConnection extends DbConnection{
function Connection()
{
echo 'MySql Connection.';
}
}
class OracleConnection extends DbConnection{
function Connection()
{
echo 'Oracle Connection.';
}
}
//创建抽象工厂
abstract class AbstractFactory{
abstract static function CreateConnection();
}
//具体工厂
class MSSqlFactory extends AbstractFactory{
public static function CreateConnection()
{
return new MSSqlConnection();
}
}
class MySqlFactory extends AbstractFactory{
public static function CreateConnection()
{
return new MySqlConnection();
}
}
class OracleFactory extends AbstractFactory{
public static function CreateConnection()
{
return new OracleConnection();
}
}
//根据不同的工厂生成不同的对象,并使用各自的方法
$Connection = OracleFactory::CreateConnection();
$Connection->Connection();
?>