简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。
ξ 12.1 工厂模式的几种形态:
① 简单工厂(Simple Factory),又称静态工厂方法模式;
② 工厂方法(Factory Method),又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virual Constructor)模式;
③ 抽象工厂(Abstract Factory),又称工具箱(Kit或Toolkit)模式。
☆ 简单工厂模式,是不同的工厂方法模式的一个特殊实现。在java语言中,通常的工厂方法模式不能通过设计功能的退化给出静态工厂模式。
ξ 12.2 简单工厂模式的引进
本节通过一个农场的实例来引入简单工厂模式,农场供应三种水果,他们是Grape、Strawberry和Apple。还有一位园丁FruitGardener,他负责提供客户需要的水果。他们的UML图如下:
水果接口定义出所有水果的抽象,具体行为包括种植、生长和收获,代码如下:
public interface Fruit
...{
public void grow();
public void harvest();
public void plant();
}Apple是一种水果,同时由于是多年生植物,多出一个treeAge属性,代码如下:
public class Apple implements Fruit
...{
public void grow()
...{
System.out.println( "Apple:grow" ) ;
}
public void harvest()
...{
System.out.println( "Apple:havest" ) ;
}
public void plant()
...{
System.out.println( "Apple:plant" ) ;
}
private int treeAge ;
public int getTreeAge()
...{
return this.treeAge ;
}
public void setTreeAge( int treeAge )
...{
this.treeAge = treeAge ;
}
}Grape也是一种水果,同时具有seedles属性区分是否有籽,代码如下:
public class Grape implements Fruit
...{
private boolean seedless;
public void grow()
...{
System.out.println( "Grape:grow" ) ;
}
public void harvest()
...{
System.out.println( "Grape:havest" ) ;
}
public void plant()
...{
System.out.println( "Grape:plant" ) ;
}
public boolean getSeedless()
...{
return seedless ;
}
public void setSeedless(boolean seedless)
...{
this.seedless = seedless ;
}
}Strawberry的代码如下:
public class Strawberry implements Fruit
...{
public void grow()
...{
System.out.println( "Strawberry:grow" ) ;
}
public void harvest()
...{
System.out.println( "Strawberry:havest" ) ;
}
public void plant()
...{
System.out.println( "Strawberry:plant" ) ;
}
}园丁FruitGardener是农场中的工厂类角色,它负责根据客户的不同需求(传入的参数不同)来产生不同的水果。它的代码如下:
public class FruitGardener
...{
public static Fruit getFruit( String name )
...{
Fruit result = null ;
if ( name.equalsIgnoreCase( "apple" ) )
result = new Apple() ;
else if ( name.equalsIgnoreCase( "grape" ) )
result = new Grape() ;
else if ( name.equalsIgnoreCase( "strawberry" ) )
result = new Strawberry() ;
return result ;
}
}ξ 12.3 简单工厂模式的结构
☆ 简单工厂模式涉及到三个角色:
① 工厂类角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体java类实现。
② 抽象产品角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个java接口或者java抽象类实现。
③ 具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体java类实现。
ξ 12.4 简单工厂模式的实现
☆ 对多层次的产品结构,简单工厂模式统一使用一个工厂类。好处是设计简单,缺点是新增的产品必将导致工厂类的修改。
☆ 一个工厂类中可以有多个工厂方法用来返回不同的产品角色
☆ 简单工厂方法中角色的省略
① 抽象产品角色的省略,如果系统中只有一个具体产品,可以省略掉抽象产品角色;
② 工厂角色与抽象产品角色合并,典型如java.text.DateFormat;
③ 三个角色全部合并。
ξ 12.5 简单工厂模式与其他模式的关系
单例、多例模式都是简单工厂方法的特殊应用,其他还有备忘录模式和更高级的MVC模式。
ξ 12.6 简单工厂模式的优点和缺点
☆ 优点:该模式的核心是工厂类,这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责消费产品,简单工厂模式通过这种做法实现了对责任的分割。
☆ 缺点:工厂类担负太多的逻辑,形成了全能的上帝类;简单工厂模式的工厂是静态实现,无法继承;工厂类通常只能部分满足开闭原则。
本文介绍简单工厂模式的概念、结构及其实现方式,并通过一个农场水果生产的例子详细解释了工厂类、抽象产品角色和具体产品角色等核心概念。

被折叠的 条评论
为什么被折叠?



