Skip to content

Latest commit

 

History

History
118 lines (79 loc) · 3.08 KB

设计模式(1)工厂模式.md

File metadata and controls

118 lines (79 loc) · 3.08 KB

工厂模式

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

主要解决:主要解决接口选择的问题。

优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

实现方式:让工厂类根据名称创建对象,并返回该对象的抽象类

实现

场景:大家可能不知道,本人是从一个大山深处的一户果农家走出的孩子,最近家那边修了马路,有不少批发商去采购水果,什么桃啊、李啊、橘啊、西瓜啊等各种水果。他们根本不关心你是怎么种出来的,只要知道这里能收到某种水果,能以低价收购就成。

所以这里以批发商收购水果进行模拟。

步骤1

我们想卖出自己的农产品,就得让人家知道你的价格,我们先创建一个水果的接口类

Fruit.java

public interface Fruit {
   void price();
}

步骤2

既然卖农产品,就得有产品是吧,所以这里创建接口的实现类,这里就演示 2 种水果桃子、橘子

Peach.java

public class Peach implements Fruit {
   @Override
   public void price() {
      System.out.println("桃子11.9");
   }
}

Orange.java

public class Orange implements Fruit {
   @Override
   public void price() {
      System.out.println("橘子5.8");
   }
}

步骤3

交易市场,怎么理解呢?批发商来收购水果,不可能自己一家家进行拜访吧,所以会有有个地方进行组织,就是交易市场的意思。批发商只要来到这个地方,报出你要进购的水果可以了,避免了自己一家家上门收购。

FruitFactor.java

public class FruitFactory {
   /**
    * 通过名称获取水果对象
    * @param name
    * @return
    */
   public Fruit buyFruit(FruitEnum name) {
      if (name == null) {
         return null;
      }
      if (FruitEnum.PEACH == name) {
         return new Peach();
      }
      if (FruitEnum.ORANGE == name) {
         return new Orange();
      }
      return null;
   }
}

这里增加了枚举类作为常量值

步骤4

通过交易市进购取水果,获取水果实现类的对象

Main.java

public class Main {
    public static void main(String[] args) {
        FruitFactory factory = new FruitFactory();

        // 获取桃子对象
        Fruit peach = factory.buyFruit(FruitEnum.PEACH);
        peach.price();
       
        // 获取橘子对象
        Fruit orange = factory.buyFruit(FruitEnum.ORANGE);
        orange.price();
    }
}

GitHub 源码