设计模式——简单工厂模式

  简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。描述

优点:

  1、工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。
  2、用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。
  3、有利于整个软件体系结构的优化。

缺点:

  1、由于工厂类集中了所有实例的创建逻辑,这就直接导致一旦这个工厂出了问题,所有的客户端都会受到牵连;
  2、由于简单工厂模式的产品是基于一个共同的抽象类或者接口,这样一来,但产品的种类增加的时候,即有不同的产品接口或者抽象类的时候,工厂类就需要判断何时创建何种种类的产品,这就和创建何种种类产品的产品相互混淆在了一起,违背了单一职责,导致系统丧失灵活性和可维护性。
  3、简单工厂模式违背了“开放封闭原则”,就是违背了“系统对扩展开放,对修改关闭”的原则,因为当我新增加一个产品的时候必须修改工厂类,相应的工厂类就需要重新编译一遍。

总结一下:

  1、简单工厂模式分离产品的创建者和消费者,有利于软件系统结构的优化;
  2、由于一切逻辑都集中在一个工厂类中,导致了没有很高的内聚性,同时也违背了“开放封闭原则”。
  3、简单工厂模式的方法一般都是静态的,而静态工厂方法是无法让子类继承的,因此,简单工厂模式无法形成基于基类的继承树结构。

示例:

  关于女娲造人的小故事,其他地方很多了,这就不多做描述了,直接给出类图。

类图结构

接口的定义:

package com.lidaming.design01.simplefactory;

public interface IHuman {
    void color();

}
View Code

WhiteHuman类的实现:

package com.lidaming.design01.simplefactory;

public class WhiteHuman implements IHuman {

    public void color() {
        System.out.println("i am white");

    }

}
View Code

YellowHuman类的实现:

package com.lidaming.design01.simplefactory;

public class YellowHuman implements IHuman {

    public void color() {
        System.out.println("i am yellow");

    }

}
View Code

BlackHuman类的实现:

package com.lidaming.design01.simplefactory;

public class BlackHuman implements IHuman {

    public void color() {
        System.out.println("i am black");

    }

}
View Code

HumanFactory工厂类的实现:

package com.lidaming.design01.simplefactory;

public class HumanFactory {

    public static IHuman getInstance(String color)
            throws InstantiationException, IllegalAccessException {
        if (color.equals("white")) {
            return WhiteHuman.class.newInstance();

        } else if (color.equals("black")) {
            return BlackHuman.class.newInstance();
        } else if (color.equals("yellow")) {
            return YellowHuman.class.newInstance();
        } else {
            System.out.println("no human:" + color);
            return null;
        }
    }
}
View Code

场景类Client的实现:

package com.lidaming.design01.simplefactory;

public class Client {
    public static void main(String[] args) throws InstantiationException,
            IllegalAccessException {
        IHuman white = HumanFactory.getInstance("white");
        white.color();
        IHuman black = HumanFactory.getInstance("black");
        black.color();
    }
}
View Code

代码分析

WhiteHuman/YellowHuman/BlackHuman是三个具体类,场景中的不同的肤色的人。

IHuman人类的抽象概念,这里只对肤色进行了描述。

HumanFactory工厂类,中实现了一个静态产生人类的方法,这个方法根据参数的不同产生不同的人(不同肤色的人)。

Client类通过向工厂类的静态方法传递不同的参数,获取到不同的实例,不同的人。

在开头也已经分析了简单工厂类优缺点。结合这个实例:

1、如果再添加一个新肤色的人种,整个代码需要做什么调整?

(1)实现一个具体类

  这个类的实现过程中,是不需要考虑工厂类做了什么操作,只需要根据接口来实现就行了,没什么好说的。

(2)修改工厂类

  工厂类需要添加相应的产生的新肤色人种的代码。但是,如果新人种不断添加呢?结果就会导致工厂类臃肿,这是不利于扩展的(“开放封闭原则”)

2、如果女娲除了造人,还要造其他动物呢?

  因为人都是基于IHuman接口实现的,造其他动物的时候,是不是要添加一个接口,然后实现,再工厂类中增加更加复杂的判断来实现呢?这明显是不利于维护的(违背了“单一职责原则”)

参考:http://blog.csdn.net/weiwenlongll/article/details/6918164

原文地址:https://www.cnblogs.com/hpuCode/p/5364573.html