您的位置:首页 > 其它

简单工厂模式(静态工厂方法模式)【设计模式】

2015-06-14 21:00 351 查看
定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现。被创建实例可以是接口、抽象类,也可以是具体的类。它又称为静态工厂方法(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 {
[align=left] [/align]
[align=left] public void testOne();[/align]
[align=left] [/align]
[align=left]}[/align]

[align=left]public class ImplApi implements Api{[/align]
[align=left] [/align]
[align=left] public void testOne()[/align]
[align=left] {[/align]
[align=left] System. out.println( "This is ImplApi." );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]

[align=left]public class ImplTwoApi implements Api {[/align]
[align=left] [/align]
[align=left] public void testOne()[/align]
[align=left] {[/align]
[align=left] System. out.println( "This is ImplTwoApi." );[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]

[align=left]public class TypeConstants {[/align]
[align=left] [/align]
[align=left] public static final int TypeOne =1;[/align]
[align=left] public static final int TypeTwo =2;[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]

[align=left]public class ApiFactory {[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] /**[/align]
[align=left] * @param type the value must in TypeConstants[/align]
[align=left] * @throws Exception[/align]
[align=left] *[/align]
[align=left] */[/align]
[align=left] public static Api createApi( int type) throws Exception[/align]
[align=left] {[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] switch(type)[/align]
[align=left] {[/align]
[align=left] case TypeConstants. TypeOne:[/align]
[align=left] return new ImplApi();[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] case TypeConstants. TypeTwo:[/align]
[align=left] return new ImplTwoApi();[/align]
[align=left] [/align]
[align=left] default :[/align]
[align=left] throw new Exception( "Unsupoorted param exception");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]客户端,需要理解传入参数的含义,这在一定程度上暴露了工厂方法的内部实现。[/align]

[align=left]public class Client {[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] public static void main(String[] args)[/align]
[align=left] {[/align]
[align=left] try {[/align]
[align=left] Api one = ApiFactory. createApi(TypeConstants. TypeOne);[/align]
[align=left] one.testOne();[/align]
[align=left] } catch (Exception e) {[/align]
[align=left] // TODO Auto-generated catch block[/align]
[align=left] e.printStackTrace();[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]

例子3:需要传入参数,具体实现是通过读取配置文件或者依赖注入来实现,也就是说,实现方式的职责委托到其它部件。 这样可以避免,不断往工厂方法中添加实现代码。

引用资料: http://stackoverflow.com/questions/929021/what-are-static-factory-methods-in-java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: