Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)

设计模式系列参考:

  http://www.cnblogs.com/Coda/p/4279688.html

一、概述 

工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 

工厂模式可以分为三类: 

  1)简单工厂模式(Simple Factory) 
  2)工厂方法模式(Factory Method) 
  3)抽象工厂模式(Abstract Factory) 

二、实践

   核心就是只要实现了统一接口(可以是标识性接口)(一般是实现了同一接口),把返回值(或者参数)进行抽象即可!

   直接看背景代码

/**
 * 动物接口
 * 作者: Administrator
 * 日期: 2017/10/25
 **/
public interface Animal {
    void run();
}

/**
 * 动物实现类——小狗
 * 作者: Administrator
 * 日期: 2017/10/25
 **/
public class Dog implements Animal{
    @Override
    public void run() {
        System.out.println("dog run...");
    }
}
/**
 * 动物实现类——小猫
 * 作者: Administrator
 * 日期: 2017/10/25
 **/
public class Cat implements Animal{
    @Override
    public void run() {
        System.out.println("cat run...");
    }
}

   外部通过静态工厂方法,提供类型即可创建相关的对象!——一般都使用静态的方法,避免创建工厂的繁琐

 public static Animal createAnimal(String type) {
        if ("dog".equalsIgnoreCase(type)) {
            return new Dog();
        } else if ("cat".equalsIgnoreCase(type)) {
            return new Cat();
        } else {
            System.out.println("找不到类型!");
            return null;
        }
    }

  // 根据阿里规范提示,这里出现了“dog”这样的魔法值!

  

 三、改进与思考

  改进为使用反射创建:

package com.roc.factory;
/**
 * 简单工厂放射实现
 * @author liaowp
 *
 */
public class SampleFactory1 {
    public static Human makeHuman(Class c){
        Human human = null;
        try {
            human = (Human) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            System.out.println("不支持抽象类或接口");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("没有足够权限,即不能访问私有对象");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("类不存在");
            e.printStackTrace();
        }    
        return human;
    }
}

  循环使用对象

  简单工厂每次都是new一个新的对象,如果业务逻辑允许,可以通过类似“单例模式”中的方式,循环使用创建的对象。——但是单例并不是简单工厂的退化,它是自身的工厂,并且构造器是私有的(防止外部创建对象)

  优缺点

  创建与使用的责任划分;

  违反“开闭原则”,难以扩展;工厂类作为“上帝类”负责了所有对象的创建,一旦工厂无法正常工作,将产生巨大影响!

原文地址:https://www.cnblogs.com/jiangbei/p/7732988.html