IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    设计模式笔记-工厂模式

    Eric Sheng\'s Blog发表于 2016-07-04 22:39:00
    love 0
    • 简单工厂
      • 场景
      • 实现
      • 小结
    • 工厂方法


    Java中的工厂设计模式是核心设计模式之一,工厂模式主要是为创建对象提供接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
    工厂模式在业界主要有三种形式,分别是:

    • 简单工厂(Simple Factory),又称静态工厂模式(static factory method)
    • 工厂方法(Factory Method)
    • 抽象工厂(Abstract Factory)

    这三个模式都是创建型 这个这三个模式名字看着挺像,概念上容易让人比较混淆。本文就介绍一下这三种模式到底有什么区别。

    简单工厂

    场景

    我们在新建一个对象的时候最常见的是去new一个对象,但有时候:

    1. 我们并不想知道这个这个对象是怎么构造;
    2. 通过公共的接口来调用接口

    举个栗子,我们在果园(FruitFacotry)里,果园里有各种各样的水果。我们想吃水果,但我并不想知道这些水果是怎么长出来的。也就是说做为一个果园的客户以及饥渴的吃货,我不关心你的水果是怎么长得,我上来就要吃你一个苹果一个橘子。
    这个场景的代码是这样的:

        public class ClientOfFruitFacotry {
            public static void main(String[] args){
                Fruit apple = FruitFacory.create("APPLE");
                apple.beEat();
                Fruit orange = FruitFacory.create("ORANGE");        
                orange.beEat();
            }           
        }
    

    实现

    那他是怎么实现的呢?非常简单我们可以这样定义FruitFactory:

        public class FruitFacotry {
            public static Fruit create (String fruitName) throws Exception {
            if (fruitName.equalsIgnoreCase("APPLE"))
                return new Apple();
            else if (fruitName.equalsIgnoreCase("ORANGE"))
                return new Orange();
            else throw new Exception(); 
        }
    

    物品间的关系也很简单:

    //抽象产品
    public interface Fruit{
        public void beEat();
    }
    //具体产品
    public class Apple implements Fruit{
        public void beEat(){
            System.out.println("eat apple");
        }
    }
    public class Orange implements Fruit{
        public void beEat(){
            System.out.println("eat orange");
        }
    }
    

    小结

    如果你的代码代码中有许多对象有着相同的父类,同时你在使用这些对象时常常用到父类的方法,那么你需要使用这种方法。这样做的好处显而易见,果园负责生成果子,客户负责消费果子,客户不需要知道果子是怎么长的,这样就实现了职责的分离。但是也会有坏处。比如你想新加一种水果,那么你必须修改FruitFacotry这个类,这样违反了开闭原则,同时这个类中集合了所有的水果的创造逻辑。
    有人会说你的这个类中会有大量的if-else语句。我们可以通过反射,hashmap,枚举等方法对这进行优化。

    工厂方法



沪ICP备19023445号-2号
友情链接