zoukankan      html  css  js  c++  java
  • 设计模式——简单工厂模式

      简单工厂模式是属于创建型模式,又叫做静态工厂方法(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

  • 相关阅读:
    HttpClient使用详解
    JBPM的.jpdl.xml文件中文出现乱码
    maven实现项目热部署
    基于Solr和Zookeeper的分布式搜索方案的配置
    MySQL5.7 多线程复制,配置和测试结果(转)
    重庆--上海手动切换容灾方案执行步骤
    elasticsearch Unassigned 分片解决办法
    基于docker使用elasticsearch-dump,es数据导入导出
    iperf3 测试linux服务器之间带宽
    elasticsearch重庆上海移动切换方案
  • 原文地址:https://www.cnblogs.com/hpuCode/p/5364573.html
Copyright © 2011-2022 走看看