工厂模式专门负责将拥有共同接口的类实例化。工厂模式可以动态的决定需要实例化哪个具体类,不必事先知道每次实例化哪个类!
工厂模式主要有三种形态:
1、简单工厂模式 simple factory : (又称静态工厂方法模式)
2、工厂方法模式 factory method : (又称多态性工厂模式)
3、抽象工厂模式 abstract factory : (又称工具箱模式)
本文将介绍第一种 简单工厂模式 的使用规则以及优缺点
(一) 首先我们先看一下simple factory 一般性结构图:
简单工厂模式就是工厂根据传入的参数决定创建出哪种具体的产品。
我们以园丁种植水果为例子具体剖析下simple factory :
"园丁根据客户的要求,种植不同的水果" ,代码如下:
public interface Fruit {
/**
* 种植
*/
public void plant();
}
public class Apple implements Fruit {
public Apple(){
System.out.println("Apple is produced...");
}
@Override
public void plant() {
System.out.println("Apple is plant...");
}
private int treeAge ;
public int getTreeAge() {
return treeAge;
}
public void setTreeAge(int treeAge) {
this.treeAge = treeAge;
}
}
public class Grape implements Fruit {
public Grape(){
System.out.println("Grape is produced...");
}
@Override
public void plant() {
System.out.println("Grape is plant...");
}
}
public class SimpleFactory {
/**
* 根据客户的指令生产某一种产品
* @param fruitName
* @return
*/
public static Fruit getFruit(String fruitName){
if(fruitName.equals("apple")){
return new Apple();
}
else if(fruitName.equals("grape")){
return new Grape();
}
else{
System.out.println("没有这种水果...");
return null ;
}
}
public static void main(String[] args) {
//客户向工厂提供某种产品的生产指令,此时客户不需要关心产品到底是怎么生产出来的,全部交由工厂负责创建
Fruit fruit = getFruit("apple");
fruit.plant();
}
}
(二) 抽象产品角色的省略
结构图如下
当系统只有一种具体产品角色时,就可以省略掉抽象产品角色
工厂类:
public class Creator{
//生产具体的产品
public static ConcreteProduct getProduct(){
return new ConcreteProduct ();
}
}
具体产品类:
public class ConcreteProduct {
public ConcreteProduct (){}
}
(三)工厂角色与抽象产品角色合并
抽象产品角色作为具体产品的工厂,可以创建出各种具体产品,最典型的例子就是JAVA Api中 DataFormat ,它是一个抽象类,提供了很多的静态方法,如getDateInstance()返回一个具体的时间类如SimpleDateFormat,getDateInstance()做了两件事情:(1)运用多态性,因为SimpleDateFormat是DataFormat的一个子类 (2)使用静态工厂方法 ,内部调用子类SimpleDateFormat的构造器
(四)简单工厂模式的优缺点
优点:模式的核心是工厂类,这个类必须含有必要的判断逻辑,以达到创建哪一种具体产品的目的。消费者不需要负责产品的创建,只需要负责消费产品。simple factory通过这种做法实现了对责任的分割
缺点:当产品类具有多层次的机构关系时,需要在工厂类中加入大量的判断逻辑,使得工厂类的复杂度会很高,不易于维护!
这一缺点会在工厂方法模式中得以克服,敬请关注工厂模式2 工厂方法模式!
http://blog.csdn.net/zj_1395201/article/details/6648464
如有疑问或者不同见解的读者请与我联系,互勉!