java设计模式:简单工厂模式
一、什么是简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、简单工厂模式的角色和职责
1.工厂(Creator)角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。
2.抽象(Product)角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
3.具体产品(Concrete Product)角色简单工厂模式所创建的具体实例对象
三、简单工厂模式的UML图
sports:抽象角色
Basketball和Football:具体产品角色
sportsFactory:工厂角色
四、简单工厂模式代码
这个例子,用运动作为抽象角色,足球和篮球作为具体的产品角色来讲解,下面看具体代码。
首先我们创建一个抽象类sports,同时有一个运动的方法
public interface Sports {/** 运动*/public void play();
}
然后,定义了一个足球类和篮球类,同样有运动方法
public class Basketball implements Sports{/** 运动*/public void play(){System.out.println("打篮球...");}
}
public class Football implements Sports{/** 运动*/public void play(){System.out.println("踢足球啦...");}
}
最后写一个工厂类,用来创造足球运动和篮球运动。
这里创建的方式有很多种方式,我们从简单的开始,逐步优化代码。
4.1、单独创建实例方法
public class SportsFactory {/** 获得Basketball类的实例public static Sports getBasketball() {return new Basketball();}/** 获得Football类实例*/public static Sports getFootball() {return new Football();}
}
这种方法,直接用两个不同的方法直接创建两个实例对象。
4.2、逻辑判断的方式
public class SportsFactory {/** getSports方法,获得所有产品对象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {if(type.equalsIgnoreCase("Basketball")) {return Basketball.class.newInstance();} else if(type.equalsIgnoreCase("Football")) {return Football.class.newInstance();} else {System.out.println("找不到相应的实例化类");return null;}}
}
先传入一个类型参数,然后判断,再用反射的方式返回对象。
前面这两种方式都不是最优的方式,因为他们都违背了开闭原则。
开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
开放-封闭原则的意思就是说,你设计的时候,时刻要考虑,尽量让这个类是足够好,写好了就不要去修改了,如果新需求来,我们增加一些类就完事了,原来的代码能不动则不动。这个原则有两个特性,一个是说“对于扩展是开放的”,另一个是说“对于更改是封闭的”。面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。这就是“开放-封闭原则”的精神所在。
下面,我们再优化一下。
4.3、反射实现方式
public class SportsFactory {/** getSports方法,获得所有产品对象*/public static Sports getSports(String type) throws InstantiationException, IllegalAccessException, ClassNotFoundException {Class Sports = Class.forName(type);return (Sports) Sports.newInstance();}
}
这种方法,通过反射的方式实现,不管我们还需要扩展什么其他功能都不用再更改这个工厂类的代码了,所以就符合开闭原则了。
五、测试
public class MainClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {//方法一测试
// //实例化一个Basketball
// Basketball Basketball = new Basketball();
// //实例化一个Football
// Football Football = new Football();
//
// Basketball.play();
// Football.play();//方法二测试
// //实例化一个Basketball,用到了多态
// Sports Basketball = new Basketball();
// Sports Football = new Football();
// Basketball.play();
// Football.play();// //实例化一个Basketball
// Sports Basketball = SportsFactory.playBasketball();
// Sports Football = SportsFactory.playFootball();
// Basketball.play();
// Football.play();//方法三测试Sports Basketball = SportsFactory.getSports("Basketball");Sports Football = SportsFactory.getSports("Football");Basketball.play();Football.play();}
}
运行结果:
六、简单工厂模式应用场景
**优点:**工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了开闭原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
java设计模式:简单工厂模式相关推荐
- 轻松看懂java设计模式简单工厂模式
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
- Java设计模式 -- 简单工厂模式(SimpleFactory)
一.什么是简单工厂模式 简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 二.模式中包含的角色及其职责 1.工厂(C ...
- java设计模式--简单工厂模式
1.概念:建立一个工厂(一个函数或一个类方法)来制造新的对象,简单工厂模式静态工厂方法模式,存在的目的很简单:定义一个用于创建对象的接口. (注意点:简单工厂模式的方法是静态的) 2.组成: 1) 工 ...
- Java——设计模式(简单工厂模式)
* A:简单工厂模式概述* 简单工厂模式又叫静态工厂方法模式,它定义了一个具体的工厂类负责创建一些类的实例* B:优点* 客户端不需要再负责对象的创建,从而明确了各个类的职责* 简单来说,客户端你只需 ...
- java设计模式-简单工厂模式
1.实例化对象不需要new,用工厂模式 2.工厂模式分为(简单工厂模式,工厂方法模式,抽象工厂模式) package com.wuming.factory.simple;public interfac ...
- Java设计模式之 工厂模式(简单工厂模式)
前一阵子学习了Java 中据说是最简单的设计模式的 单例模式,想一起讨论学习的小伙伴请点击这里: Java 设计模式之单例模式 那么今天就把学习的工厂模式记录下来 工厂模式: 实现了创建者和调用者的分 ...
- Java设计模式(工厂模式>抽象工厂模式和原型模式)
Java设计模式Ⅱ 1.工厂模式 1.1 简单工厂模式 1.2 工厂方法模式 2.抽象工厂模式 3.总结 4.原型模式 4.1 原型模式 4.2 浅拷贝 4.3 深拷贝 5.建造者模式 1.工厂模式 ...
- 三角形圆形创建与擦除java_设计模式---------------简单工厂模式
设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- java设计模式之工厂模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
最新文章
- Linux查看本机端口
- 在Windows IoT上使用网络摄像头
- python 日志分析_python 日志分析统计脚本 | 学步园
- 两层卷积网络实现手写数字的识别(基于tensorflow)
- sed 空格 制表符_您喜欢制表符还是空格?
- Spring Boot 细节挖掘(全局异常处理)
- 虚拟机开启mysql服务_远程操作虚拟机中的mysql服务器
- sed命令 linux下的超强查找和替换命令
- Ubuntu16.06LTS安装gnome-3.8桌面
- 联想服务器虚拟化解决方案,联想虚拟化解决方案
- java的JDBC简单案例
- c语言版本双人贪吃蛇
- EPSG是什么?WKT是什么?SRID是什么?EPSG、WKT、SRID概念
- 为什么要使用NAS存储设备呢?
- 微软的SqlHelper做数据层(一)
- virtualbox虚拟机窗口大小调整
- 2019年最新面试题集绵
- 常见的WebShell管理工具(top10)
- nginx反向代理到第三方服务商的服务器
- android 保存图片到手机相册,并通知相册刷新
热门文章
- Windows Batch [精华]
- 四种方法取表里n到m条纪录:[转]
- 区块链BaaS云服务(35)亦笔科技ODRChain
- 区块链BaaS云服务(14)华大BGI区块链“Baas接口“
- C++ Primer 5th笔记(chap 15 OOP)抽象基类
- 简单的计数器程序_javaweb
- IDA无法反编译 and 提示错误
- buu Cipher
- UltraEdit-64中文安装
- Python编程实现粒子群算法(PSO)详解