定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现。被创建实例可以是接口、抽象类,也可以是具体的类。它又称为静态工厂方法(Static Factory Method)模式
简单工厂模式的作用,优点:为客户端屏蔽所需要的实例的具体实现,客户端只需关注某个接口便可,无需关注实现。具体实现被封装起来;客户端和具体实现解耦,客户端只需关注接口,接口的实现变化对客户端没有影响。总结起来,就是封装功能,封转实例的具体实现;解耦功能,接口实现的变化影响不了客户端。
例子:
例子1:不带参数
没有参数传给工厂方法,工厂方法只返回一种类型的实现,不使用参数选择实现。
public class DbConnection
{
private static final int MAX_CONNS = 100;
private static int totalConnections = 0;
private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();
private DbConnection()
{
// ...
totalConnections++;
}
public static DbConnection getDbConnection()
{
if(totalConnections < MAX_CONNS)
{
return new DbConnection();
}
else if(availableConnections.size() > 0)
{
DbConnection dbc = availableConnections.iterator().next();
availableConnections.remove(dbc);
return dbc;
}
else {
throw new NoDbConnections();
}
}
public static void returnDbConnection(DbConnection dbc)
{
availableConnections.add(dbc);
//...
}
}
例子2:带参数,选择具体实现
简单工厂方法有传入参数,使用传入参数来确定实现。这种方式,暴露了一定的内部实现细节,因为客户端,要理解参数的含义,才可以正确使用简单工厂方法。而参数的含义,是跟具体实现有关系的,用参数来选择某个具体实现。
public interface Api {
public void testOne();
}
public class ImplApi implements Api{
public void testOne()
{
System. out.println( "This is ImplApi." );
}
}
public class ImplTwoApi implements Api {
public void testOne()
{
System. out.println( "This is ImplTwoApi." );
}
}
public class TypeConstants {
public static final int TypeOne =1;
public static final int TypeTwo =2;
}
public class ApiFactory {
/**
* @param type the value must in TypeConstants
* @throws Exception
*
*/
public static Api createApi( int type) throws Exception
{
switch(type)
{
case TypeConstants. TypeOne:
return new ImplApi();
case TypeConstants. TypeTwo:
return new ImplTwoApi();
default :
throw new Exception( "Unsupoorted param exception");
}
}
}
客户端,需要理解传入参数的含义,这在一定程度上暴露了工厂方法的内部实现。
public class Client {
public static void main(String[] args)
{
try {
Api one = ApiFactory. createApi(TypeConstants. TypeOne);
one.testOne();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
例子3:需要传入参数,具体实现是通过读取配置文件或者依赖注入来实现,也就是说,实现方式的职责委托到其它部件。 这样可以避免,不断往工厂方法中添加实现代码。
引用资料:
http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java