设计模式系列参考:

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

一、概述

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

工厂模式可以分为三类:

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

二、实践

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

   直接看背景代码

  1. /**
  2. * 动物接口
  3. * 作者: Administrator
  4. * 日期: 2017/10/25
  5. **/
  6. public interface Animal {
  7. void run();
  8. }
  9.  
  10. /**
  11. * 动物实现类——小狗
  12. * 作者: Administrator
  13. * 日期: 2017/10/25
  14. **/
  15. public class Dog implements Animal{
  16. @Override
  17. public void run() {
  18. System.out.println("dog run...");
  19. }
  20. }
  21. /**
  22. * 动物实现类——小猫
  23. * 作者: Administrator
  24. * 日期: 2017/10/25
  25. **/
  26. public class Cat implements Animal{
  27. @Override
  28. public void run() {
  29. System.out.println("cat run...");
  30. }
  31. }

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

  1. public static Animal createAnimal(String type) {
  2. if ("dog".equalsIgnoreCase(type)) {
  3. return new Dog();
  4. } else if ("cat".equalsIgnoreCase(type)) {
  5. return new Cat();
  6. } else {
  7. System.out.println("找不到类型!");
  8. return null;
  9. }
  10. }

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

  

三、改进与思考

  改进为使用反射创建:

  1. package com.roc.factory;
  2. /**
  3. * 简单工厂放射实现
  4. * @author liaowp
  5. *
  6. */
  7. public class SampleFactory1 {
  8. public static Human makeHuman(Class c){
  9. Human human = null;
  10. try {
  11. human = (Human) Class.forName(c.getName()).newInstance();
  12. } catch (InstantiationException e) {
  13. // TODO Auto-generated catch block
  14. System.out.println("不支持抽象类或接口");
  15. e.printStackTrace();
  16. } catch (IllegalAccessException e) {
  17. // TODO Auto-generated catch block
  18. e.printStackTrace();
  19. System.out.println("没有足够权限,即不能访问私有对象");
  20. } catch (ClassNotFoundException e) {
  21. // TODO Auto-generated catch block
  22. System.out.println("类不存在");
  23. e.printStackTrace();
  24. }
  25. return human;
  26. }
  27. }

  循环使用对象

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

  优缺点

  创建与使用的责任划分;

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

Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)的更多相关文章

  1. 设计模式学习之简单工厂(Simple Factory,创建型模式)(1)

    简单工厂(Simple Factory,创建型模式) 第一步: 比如我们要采集苹果和香蕉,那么我们需要创建一个Apple类和Banana类,里面各自有采集方法get(),然后通过main方法进行调用, ...

  2. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  3. 设计模式的征途—2.简单工厂(Simple Factory)模式

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  4. 设计模式在cocos2d-x中的使用--简单工厂模式(Simple Factory)

    什么是简单工厂模式? 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式.通过专门定义一个类来负责创建其它类的实例,被创建的实例 ...

  5. C++设计模式 ==> 策略模式与简单工厂模式结合

    简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...

  6. 设计模式之策略模式&简单工厂模式

    学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...

  7. 设计模式--简单工厂(Simple Factory)

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  8. 简单工厂(Simple Factory)模式

    工厂模式专门负责将大量有共同接口的类实例化.工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式有以下几种形态: 简单工厂(Simple Factory)模式 工厂方法(F ...

  9. 设计模式(Java版)-创建型模式之简单工厂模式

    前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出).这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟! 一.工厂模式的动机 在软件系统中,经常面 ...

随机推荐

  1. OC基础数据类型-NSString

    1.字符串的初始化 //字符串的初始化 NSString *str = @"Hello world!"; NSString *str2 = [[NSString alloc] in ...

  2. 魅族首页导航效果(不兼容IE)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 如何使用Excel选择整列排序

    在excel中,排序的时候弹窗提示“若要执行此操作,所有合并单元格需大小相同”,该怎么操作才能实现排序呢?接下来,小编就和大家分享具体操作.   工具/原料   excel 方法/步骤     打开出 ...

  4. 使用Fragment填充ViewPager

    在上一篇文章中,讲解了使用PagerAdapter作为适配器时的ViewPager的使用方法.然后在实际项目中更多的使用Fragment作为页卡,因为实际开发中每一个页卡要复杂的多.而使用Fragme ...

  5. VS2013安装部署过程详解

    注意:缺少安装部署的小伙伴,看上一篇有详细介绍 程序在“Release”平台下编译运行没有错误 第一步:“新建”------“项目”------“其他项目类型”------“安装部署”------“I ...

  6. es6之类与对象

    一.类的定义 class Parent{ constructor(name="mukewang"){ this.name=name; } } let v_parant=new Pa ...

  7. 前端使用ajax传到后台的实体类的多个属性,直接用Map接收

    前端ajax传过来的数据按照以上方法接收Map中 var ip = $("#ip").val(); var port = $("#port").val(); v ...

  8. mybatis分页PageHelper插件的使用

    1.jar包, 2.改mybatis的配置文件,加上这段配置: <plugins><plugin interceptor="com.github.pagehelper.Pa ...

  9. svn安装配置

    1. 安装SVN服务器: 检查是否已安装 # rpm -qa subversion 安装SVN服务器 # yum install httpd httpd-devel subversion mod_da ...

  10. Python之基本排序算法的实现

    import cProfile import random class SortAlgorithm: def __init__(self,unsortedlist=[]): self.unsorted ...