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

定义:提供一个创建实例的功能,客户端使用者无需关心实例的具体实现。被创建实例可以是接口、抽象类,也可以是具体的类。它又称为静态工厂方法(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

时间: 2024-11-03 01:25:10

简单工厂模式(静态工厂方法模式)【设计模式】的相关文章

【C#设计模式——创建型模式】工场方法模式

工场方法模式对简单工场模式进行了乔庙的扩展,不是用一个专门的类来决定实例化哪一个子类.相反,超类把这种决定延迟到每个子类.这种模式实际上没有决策点,就是没有直接选择一个子类实例化的决策. 看书上的例子有点复杂,自己写了一个简单例子: 示例目标:对数组进行定向排序 基类FormatList对指定数组进行排序,具体实现交给子类实现 public abstract class FormatList { public int[] result; protected abstract void Forma

原型模式和模版方法模式

首先我们来了解原型模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 根据定义,我们很明显地知道原型模式的对象是类.通过原型模式,我们可以无限地复制原型的对象 接着我们了解模版方法模式 定义:定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中.模版方法使用使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 其实就是规定完成某件事情需要做多少步,并且规定那些需要你发挥自己的想象.能力根据实际情况去完成的. 综上所述.这两种设计模式的对象不同.原型是一个大的

php设计模式 — 简单工厂模式(静态工厂方法模式)

概念 简单工厂模式 [静态工厂方法模式](Static Factory Method) 是类的创建模式 工厂模式的几种形态: 1.简单工厂模式(Simple Factory) |又叫做  静态工厂方法模式(Static Factory Method) 2.工厂方法模式(Factory Method) |又叫做 多态性工厂模式(Polymorphic Factory) 3.抽象工厂模式(Abstract Factory) |又叫做 工具箱模式(ToolKit) 配图 代码实例 直接将代码运行即可,

设计模式实战应用之五:工厂方法模式

工厂方法模式的定义        工厂方法模式的应用相当广泛. 工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个非常著名的工厂方法模式的演示样例:java.net.URLStreamHandlerFactory 的 createURLStreamHandler(String protocol)  也是工厂方法模式的一个非常经典的应用,URLStreamHandlerFactory 定义了一个用来创建 URLStr

简单工厂模式--工厂方法模式(简介)

一.简单工厂模式(静态工厂) 简单工厂模式不属于23种标准设计模式 简单工厂模式是工厂方法模式的一个特殊的实现 简单工厂就是由一个工厂类根据传入的参数决定创建出哪一种产品类的实例  二.实现 产品接口或者抽象类 package factory; /* * 产品接口 */ public interface Product { //生产工艺 public void craftwork(); //产品类型 public void type(); } 实现的子类 package factory; /*

浅析 抽象工厂、工厂方法、简单(静态)工厂

----简单工厂 (也叫静态工厂模式):一个抽象产品抽象出多个具体产品类,一个具体工厂类 代码: //抽象产品角色 public interface Car{ public void drive(); } //具体产品角色 public class Benz implements Car{ public void drive() { System.out.println("Driving Benz "); } } public class Bmw implements Car{ pub

简单工厂(静态工厂)

简单工厂模式是属于创建型模式,又叫做静态工厂.是由一个工厂对象(Factory)决定创建出哪一种产品类(Product)的实例. 设计模式可以结合具体场景进行分析,但不要局限在具体场景中,本文直接使用模型进行说明,相对抽象,但对举一反三有好处. base.h #ifndef BASE_H #define BASE_H #include <string> using namespace std; class IBase { public: virtual ~IBase(); virtual co

Head First设计模式——简单工厂、工厂、抽象工厂

前言:按照惯例我以Head First设计模式的工厂模式例子开始编码学习.并由简单工厂,工厂模式,抽象工厂模式依次演变,归纳他们的相同与不同. 话说Head First认为简单工厂并不是设计模式,而是一种编程习惯,但并不妨碍我们使用它,接下来我们对工厂模式一探究竟. 1.披萨店例子 首先我们要开一个披萨店,对于业务不复杂的情况下我们可以快速的开发出一个披萨店以及订购披萨的逻辑 public Pizza OrderPizza() { Pizza pizza = new Pizza(); pizza

设计模式(java)--模版方法模式之任务分配

转自:http://blog.csdn.net/zhengzhb/article/details/7405608 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就