设计模式:工厂模式

来源:互联网 发布:python 每1s执行一次 编辑:程序博客网 时间:2024/06/01 23:19

顾名思义,工厂模式就是能够像工厂一样,不断创建实例对象。在现实中,一个工厂生产一种或者几种产品;一些大厂可能会更复杂一下,不由不同的产品系列,不同系列下又会有不同的种类的产品。

常见的工厂模式有:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式

UML类图

实现示例

MYOTee脸萌是曾经比较火的拼脸游戏,其中用户可以选择不同的发型。在这里,我们模拟对不同发型的选择,并简化发型为左偏分、中分、右偏分。

发型接口,里面有一个选择发型的行为(画发型)

public interface HairStyle {    void drawHair();}

几种发型实现

左偏分

public class LeftHairStyle impliments HairStyle {    @Override    public void drawHair(){        System.out.println("我选择了左偏分发型");    }}

中分

public class InHairStyle impliments HairStyle {    @Override    public void drawHair(){        System.out.println("我选择了中分发型");    }}

右偏分

public class RightHairStyle impliments HairStyle {    @Override    public void drawHair(){        System.out.println("我选择了右偏分发型");    }}

工厂类

public class HairFactory {    public HairStyle chooseHair(String arg) {        if(arg.equals("left")) {            return new LeftHairStyle();        }else if(arg.equals("in")) {            return new InHairStyle();        }else if(arg.equals("right")) {            return new RightHairStyle();        }        return null;    }}

客户端

public class Client {    public static void main(String[] args) {        HairFactory factory = new HairFacotry();        HairStyle hair = factory.chooseHair("right");        hair.drawHair();        hair=factory.chooseHair("in");        hair.drawHair();        }}

结果为:

我选择了右偏分发型我选择了中分发型
  • 不足
    当我们又开发出了一种新发型,那么我们就需要在factory中再增加一个判断,修改factory中的代码,这样就违背了 开闭原则
  • 解决思路
    增加一个配置文件,记录给定的唯一标识到具体实现子类之间的映射关系,应用启动时,将这些映射关系读取到一个map中,这样在factory中只需要做的工作为:1、从map中获取给定的具体实现子类信息;2、根据信息创建实例对象并返回。
  • 实际中,spring就是通过这种方式来管理bean的。通过在spring bean的配置文件中配置bean信息,spring应用启动后,bean配置文件会被解析存储到map中,以后通过BeanFactory获取bean实例对象,就是从map中查找bean信息并实例化的过程。

工厂方法模式

UML类图

简单来说,就是什么样的工厂生产什么样的产品,即每个Factory只生产一种具体的产品。就不举例子了。

抽象工厂方法

UML类图

总结

  • 简单工厂模式、工厂方法模式、抽象工厂模式的演化主要在于 让每个Factory的生产职责更加专业化 。这样模拟实际生活中,不同产品族、产品系列的概念,让每个Factory职责专一化。
  • 为了尽可能降低业务中增加或者减少产品的需求会导致对代码的修改影响,建议采用 配置文件+反射 或者 注解+反射 实现自动产品注册,然后给予唯一id获取对应实例。