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

      优缺点

      创建与使用的责任划分;

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

  • 相关阅读:
    Bzoj1072--Scoi2007排列perm
    Bzoj1041--Haoi2008圆上的整点
    Bzoj3932--Cqoi2015任务查询系统
    HDU 1024 Max Sum Plus Plus(DP)
    HDU 1029 Ignatius and the Princess IV
    【noip模拟题】数列
    Hello World
    vue-router 进阶
    vue2.0 源码解读(二)
    vue2.0 源码解读(一)
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7732988.html
Copyright © 2020-2023  润新知