一、什么是简单工厂模式

简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

二、模式中包含的角色及其职责

1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象

三、具体实例

现在有两个类,分别是Apple和Banana,都有一个Get方法:

Apple.java

package cc.dewdrop;public class Apple{public void get(){System.out.println("采集苹果");}
}

Banana.java

package cc.dewdrop;public class Banana{public void get(){System.out.println("采集香蕉");}
}

在主方法中实例化并分别调用个体方法:

package cc.dewdrop;public class SimpleFactory {public static void main(String[] args) {Apple apple = new Apple();Banana banana = new Banana();apple.get();banana.get();}
}

发现两个类都有一个共同的get方法,那么我们就可以抽象出一个接口,然后Apple和Banana两个类分别实现这个接口:

Fruit.java

package cc.dewdrop;public interface Fruit {public void get();
}

Apple.java

package cc.dewdrop;public class Apple implements Fruit{public void get(){System.out.println("采集苹果");}
}

Banana.java

package cc.dewdrop;public class Banana implements Fruit{public void get(){System.out.println("采集香蕉");}
}

在主方法中就可以使用下面这种方式来创建对象:

public class SimpleFactory {public static void main(String[] args) {Fruit apple = new Apple();Fruit banana = new Banana();apple.get();banana.get();}
}

根据简单工厂模式的特点,现在就需要创建一个类来创建类的对象:

FruitFactory.java

package cc.dewdrop;public class FruitFactory {/*** 获得Apple实例*/public Fruit getApple() {return new Apple();}/*** 获得Banana实例*/public Fruit getBanana() {return new Banana();}
}

在主方法中就可以使用如下方式进行调用:

public class SimpleFactory {public static void main(String[] args) {Fruit apple = new FruitFactory().getApple();Fruit banana = new FruitFactory().getBanana();apple.get();banana.get();}
}

再进一步,我们可以修改工厂类,使用静态方法来创建对象:

FruitFactory.java

package cc.dewdrop;public class FruitFactory {/*** 获得Apple实例*/public static Fruit getApple() {return new Apple();}/*** 获得Banana实例*/public static Fruit getBanana() {return new Banana();}
}

在主方法中就可以直接使用类名来调用:

public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getApple();Fruit banana = FruitFactory.getBanana();apple.get();banana.get();}
}

进一步改进工厂类,希望有一个公用的方法来创建所有产品的对象:

FruitFactory.java

package cc.dewdrop;public class FruitFactory {public static Fruit getFruit(String type) throws InstantiationException, IllegalAccessException {if (type.equalsIgnoreCase("apple")) {return Apple.class.newInstance();} else if (type.equalsIgnoreCase("banana")) {return Banana.class.newInstance();} else {System.out.println("class not found");}return null;}
}

在主方法中使用如下方式调用:

public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getFruit("apple");Fruit banana = FruitFactory.getFruit("banana");apple.get();banana.get();}
}

这样调用工厂类创建对象的操作就简化了很多,但是还有一个缺点,就是如果在新增加一个类是,就必须修改工厂类。那么此时工厂类可以做出如下修改:

FruitFactory.java

package cc.dewdrop;public class FruitFactory {public static Fruit getFruit(String type)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return (Fruit) Class.forName(type).newInstance();}
}

需要注意一点的是,在调用的时候需要使用类的完整路径(包括包名):

public class SimpleFactory {public static void main(String[] args) {Fruit apple = FruitFactory.getFruit("cc.dewdrop.Apple");Fruit banana = FruitFactory.getFruit("cc.dewdrop.Banana");apple.get();banana.get();}
}

四、简单工厂模式的优缺点

在这个模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在使用时可以直接根据工厂类去创建所需的实例,而无需了解这些对象是如何创建以及如何组织的。有利于整个软件体系结构的优化
      不难发现,简单工厂模式的缺点也正体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,所以“高内聚”方面做的并不好。另外,当系统中的具体产品类不断增多时,可能会出现要求工厂类也要做相应的修改,扩展性并不很好。

转载于:https://www.cnblogs.com/zhangtingkuo/p/4715283.html

Java设计模式 -- 简单工厂模式(SimpleFactory)相关推荐

  1. 轻松看懂java设计模式简单工厂模式

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

  2. 解读设计模式----简单工厂模式(SimpleFactory Pattern),你要什么我就给你什么

    本文首发于博客园,地址:http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html 一.模式概述 从设计模式的类型上来说,简单工厂模式是 ...

  3. java设计模式--简单工厂模式

    1.概念:建立一个工厂(一个函数或一个类方法)来制造新的对象,简单工厂模式静态工厂方法模式,存在的目的很简单:定义一个用于创建对象的接口. (注意点:简单工厂模式的方法是静态的) 2.组成: 1) 工 ...

  4. Java——设计模式(简单工厂模式)

    * A:简单工厂模式概述* 简单工厂模式又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例* B:优点* 客户端不需要再负责对象的创建,从而明确了各个类的职责* 简单来说,客户端你只需 ...

  5. java设计模式-简单工厂模式

    1.实例化对象不需要new,用工厂模式 2.工厂模式分为(简单工厂模式,工厂方法模式,抽象工厂模式) package com.wuming.factory.simple;public interfac ...

  6. Java设计模式之 工厂模式(简单工厂模式)

    前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...

  7. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  8. Java设计模式(工厂模式>抽象工厂模式和原型模式)

    Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...

  9. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

最新文章

  1. 因热爱而编码,创造至美生活,挑战高效工作 阿里云智能开发者创新应用大赛全记录...
  2. [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句...
  3. 16、ASP.NET MVC入门到精通——MVC过滤器
  4. linux shell脚本 wget,bash – 在shell脚本中运行wget和其他命令
  5. 11没有源码注释_我们为什么要看源码、应该如何看源码?
  6. Pygal简介、画廊--各种图形绘图代码
  7. java_security之base64原理解析以及三种代码的实现方式
  8. ReactNative入门之android与rn初始化参数的传递
  9. 描述C,C++编译和链接过程
  10. MFC使用ODBC连接SQL Server 2008数据库编程
  11. 磁力计椭球拟合使用篇 IMU 加速度、电子罗盘校准
  12. AutoCAD2010安装教程
  13. Android使用LAME Mp3编码
  14. 计算机桌面锁屏设置,怎么设置电脑锁屏
  15. Voxelization 三维模型体素化
  16. error C4189
  17. NX二次开发-UFUN获取工程图所有视图tag UF_DRAW_ask_views
  18. Axios源码深度剖析
  19. Pytorch阅读文档之flatten函数
  20. java 车牌号验证正则表达式_车牌号校验正则表达式

热门文章

  1. python判断对错题_python 初学者错题本
  2. 炸了,为什么某高速网络总是二层通三层不通?
  3. 100+人的企业IP怎么进行安全配置 ?
  4. java西游记壹_岩浆数码再现手机RPG游戏--西游记壹
  5. 阿里云 MSE 云原生网关助力斯凯奇轻松应对双 11 大促
  6. 消息队列RocketMQ应对双十一流量洪峰的“六大武器”
  7. 阿里云入选 2021 Gartner APM 魔力象限,国内唯一入选云厂商
  8. Delphi XE 10.4 FMX ListView 一个不易察觉的 BUG
  9. 使用opengl编程实现一个三维渲染实体_Unity Shader学习随记_01_渲染流水线
  10. 实体类dao接口mysql_利用MyBatis生成器自动生成实体类、DAO接口和Mapping映射文件...