工厂模式 - 简单工厂

1、简单工厂模式

1.1、什么是简单工厂模式

  简单工厂模式是类的创建模式,又叫做静态工厂方法模式。简单工厂模式是由一个工厂对象决定创建出哪一类产品类的实例。由一个工厂类根据传入的参数来决定创建出哪一种产品类的实例。

      

1.2、简单工厂模式的结构

       工厂类(Creator)角色:工厂方法模式的核心,含有与应用紧密相关的逻辑。工厂类在客户端的调用下直接创建产品对象。往往由一个具体的Java类实现。

       抽象产品(Product)角色:工厂方法模式所创建的对象的父类,或他们共同拥有的接口。抽象产品角色可以用一个Java接口或者Java抽象类表示。

       具体产品(Concrete Product)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体Java类实现。

 

/**
 * 简单工厂模式*/
  public class SimpleFactoryClient {
    public static void main(String[] args) {
        Product product = Creator.factory("product1");
    }
}
  
 /**
 * 抽象产品角色1
 */
  interface Product{
}
  
/**
 * 具体产品角色11
 */
  class ConcreteProduct1 implements Product{
}
  /**
 * 具体产品角色21
 */
  class ConcreteProduct2 implements Product{
}

  /**
 * 工厂类角色
 */
  class Creator{
    public static Product factory(String type){
        if("product1".equals(type)){
            return new ConcreteProduct1();
        }else if("product2".equals(type)){
            return new ConcreteProduct2();
        }
        return null;
    }
}

 


1.3、优点
     

       简单工厂模式的核心是工厂类。这个类含有必要的判断逻辑,以决定创建哪一个产品类的实例。客户端免除了直接创建产品类的责任,仅仅负责”消费”产品。

 

1.4、缺点

       工厂类集中了所有的产品创建逻辑,形成一个无所不知的全能类。这个类如果不能正常工作了,那么使用到了这个工厂类的地方都将受到影响。

 

1.5、实例 

这里用了lombok包

抽象产品

 1 /**
 2  * 抽象产品角色
 3  * 水果
 4  */
 5 public interface Fruit {
 6 
 7     /**
 8      * 默认方法,用于打印
 9      * @param msg 打印的信息
10      */
11     default void log(String msg){
12         System.out.println(msg);
13     }
14 
15     /**
16      * 生长
17      */
18     void grow();
19 
20     /**
21      * 收获
22      */
23     void harvest();
24 
25     /**
26      * 种植
27      */
28     void plant();
29 }

具体产品:苹果

/**
 * 具体产品
 * 苹果
 */
@Data
public class Apple implements Fruit{

    /**
     * 树龄
     */
    private int treeAge;

    @Override
    public void grow() {
        log("Apple is growing ...");
    }

    @Override
    public void harvest() {
        log("Apple has been harvested ...");
    }

    @Override
    public void plant() {
        log("Apple has been planted ...");
    }
}

具体产品:葡萄

/**
 * 具体产品
 * 葡萄
 */
@Data
public class Grape implements Fruit{

    /**
     * 是否有籽
     */
    private boolean seedless;

    @Override
    public void grow() {
        log("Grape is growing ...");
    }

    @Override
    public void harvest() {
        log("Grape has been harvested ...");
    }

    @Override
    public void plant() {
        log("Grape has been planted ...");
    }
}

具体产品:草莓

/**
 * 具体产品
 * 草莓
 */
public class Strawberry implements Fruit{

    @Override
    public void grow() {
        log("Strawberry is growing ...");
    }

    @Override
    public void harvest() {
        log("Strawberry has been harvested ...");
    }

    @Override
    public void plant() {
        log("Strawberry has been planted ...");
    }
}

工厂类:果农

/**
 * 工厂类
 * 果农
 */
public class FruitGardener {

    /**
     * 静态工厂方法
     * @param which 生产的产品标识
     * @return
     */
    public static Fruit factory(String which){
        if("apple".equalsIgnoreCase(which)){
            return new Apple();
        }
        else if("grape".equalsIgnoreCase(which)){
            return new Apple();
        }
        else if("strawberry".equalsIgnoreCase(which)){
            return new Apple();
        }else{
            throw new RuntimeException("not has fruit");
        }
    }
}

客户端

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        Fruit apple = FruitGardener.factory("apple");
        apple.grow();
        apple.harvest();
        apple.plant();
        System.out.println("");

        Fruit grape = FruitGardener.factory("grape");
        grape.grow();
        grape.harvest();
        grape.plant();
        System.out.println("");

        Fruit strawberry = FruitGardener.factory("strawberry");
        strawberry.grow();
        strawberry.harvest();
        strawberry.plant();
    }
}

运行结果:

 

 1.6、总结

   简单工厂模式的核心是通过一个静态的工厂方法,根据入参去判断返回的具体产品对象。降低了客户端与系统之间的耦合,但是同时也加重了这个静态工厂方法的负担。每次拓展都需要修改这个静态工厂方法,违反了开闭原则。同时静态工厂方法的随着具体产品的对象不断增加,静态工厂方法中的判断也相应增加。负担越来越重。

 

 

 

参考:

  《Java与模式》

posted @ 2018-10-05 21:17  Simple°  阅读(192)  评论(0编辑  收藏  举报