首页 > 其他 > 详细

设计模式之简单工厂模式

时间:2015-02-15 16:36:24      阅读:210      评论:0      收藏:0      [点我收藏+]
简单工厂模式又称为静态工厂方法模式,属于创建型模式。

结构
简单工厂模式包括工厂、抽象产品和具体产品三个角色。
  • 工厂根据传入参数和判断逻辑,创建并返回具体产品,是简单工厂模式的核心。一般将工厂方法定义为静态方法,使调用者不需要实例化工厂就可以直接获取具体产品。
  • 抽象产品是具体产品必须实现的接口或继承的基类。根据里氏替换原则,如果能够使用基类对象,那么一定能够使用其子类对象;静态工厂方法如果能够返回抽象产品对象,那么一定能够返回具体产品对象。简单工厂模式的关键在于声明抽象产品作为工厂方法的返回值,然后在分支结构创建并返回具体产品对象。
  • 具体产品实现抽象产品接口或继承抽象产品基类,是工厂实际生产的产品。

优点
  • 提供单一职责的工厂用于创建对象,分离了产品的创建和使用过程;
  • 调用者只需要知道具体产品类的别名,既不需要知道具体产品类的全名,也不需要知道创建具体产品对象的细节;
  • 可以在不修改调用者代码的情况下,使用配置文件动态指定需要创建的具体产品,提高了系统的灵活性。

缺点
  • 工厂包含所有具体产品的创建逻辑和判断逻辑,负担相对过重;
  • 增加抽象产品和具体产品类,增加了系统的复杂度;
  • 增加新的具体产品需要修改工厂的判断逻辑,具体产品种类过多时,判断逻辑将会非常复杂,不利于系统的扩展和维护。

使用场景
  • 工厂负责创建的具体产品种类少,不需要经常增加新的具体产品,不需要经常修改具体产品的创建逻辑。
  • 调用者直接获取具体产品,不关心具体产品的创建逻辑。

实例
日常生活中我们经常需要购买蔬菜,但是我们不关心蔬菜的种植过程,只需要消费市场上的蔬菜产品。
蔬菜农场承担工厂角色,负责生产具体蔬菜:
public class VegetableFarm {

    public static Vegetable getVegetable(String vegetableName) {
        switch (vegetableName.toLowerCase()) {
        case "carrot":
            return new Carrot();
        case "potato":
            return new Potato();
        case "tomato":
            return new Tomato();
        }
        throw new UnsupportedOperationException();
    }
}
蔬菜承担抽象产品角色,定义所有蔬菜共有的属性和行为:
public abstract class Vegetable {

    protected double weight = 0;

    public double getWeight() {
        return weight;
    }
}
胡萝卜、土豆和番茄承担具体产品角色,是蔬菜农场实际生产的产品:
public class Carrot extends Vegetable {

}

public class Potato extends Vegetable {

}

public class Tomato extends Vegetable {

}
消费者承担调用者角色,只需要调用工厂方法就可以直接获取具体产品:
Vegetable vegetable = VegetableFarm.getVegetable("Tomato");

设计模式之简单工厂模式

原文:http://blog.csdn.net/magnificent_tony/article/details/43835697

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!