java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说就是,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
首先举个例子:创建两个类,一个Apple,一个Banana,都有个一方法
public class Apple{
public void get(){
System.out.println("采集苹果");
}
}
public class Banana{
public void get(){
System.out.println("采集香蕉");
}
}
在创建一个主方法来调用这两个类中的方法
public class MainClass {
public static void main(String[] args) {
//实例化Apple
Apple apple = new Apple();
//实例化Banana
Banana banana = new Banana();
apple.get();
banana.get();
}
}
执行后,输出结果为:
采集苹果
采集香蕉
但是代码还可以改进,可以看出Apple与Banana的功能类似,所以可以抽取出一个接口,并让Apple与Banana实现此接口
public interface Fruit {
public void get();
}
public class Apple implements Fruit{
public void get(){
System.out.println("采集苹果");
}
}
public class Banana implements Fruit{
public void get(){
System.out.println("采集香蕉");
}
}
这时,主方法调用形式就变成了这样
public class MainClass {
public static void main(String[] args) {
//实例化一个Apple,用到了多态
Fruit apple = new Apple();
//实例化一个Banana,用到了多态
Fruit banana= new Banana();
apple.get();
banana.get();
}
}
这样还是刚才的结果,不同的代码达到了相同的目的。
而简单工厂模式则是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类,上面的代码可以看出Apple与Banana实现了同一个接口,所以我们还需要创建一个工厂类来专门创建Apple与Banana的实例,继续改进
创建一个工具类
public class FruitFactory {
//获取Apple的实例,用static修饰,方便使用
public static Fruit getApple(){
return new Apple();
}
//获取Banana的实例,用static修饰,方便使用
public static Fruit getBanana(){
return new Banana();
}
}
Apple类,Banana类与Fruit接口没有变化
主方法修改为
public class MainClass {
public static void main(String[] args) {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getApple();
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getBanana();
apple.get();
banana.get();
}
}
同样和之前是一样的结果
这就是一个简单工厂模式的基本使用了,但这样的工厂类还不够好,例子中只有两个实例对象,但如果例子多了以后,工厂类就会产生很多很多的get方法。所以进行如下优化
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("找不到相应的实体类");
return null;
}
}
}
这时主方法修改为:
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getFruit("apple");
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getFruit("banana");
apple.get();
banana.get();
}
}
这样就可以根据传入的参数动态的创建实例对象,而且传入的参数还可以自定义,非常的灵活,但缺点也很明显,工厂类中有大量的判断
还有另外一种方式
public class FruitFactory {
public static Fruit getFruit(String type) throws ClassNotFoundException, InstantiationException, IllegalAccessException{
Class fruit = Class.forName(type);
return (Fruit) fruit.newInstance();
}
}
主方法修改为
public class MainClass {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//实例化一个Apple,用到了工厂类
Fruit apple = FruitFactory.getFruit("Apple");
//实例化一个Banana,用到了工厂类
Fruit banana= FruitFactory.getFruit("Banana");
apple.get();
banana.get();
}
}
这种方法可以看到,工厂类非常的简洁,但主方法在调用时,输入的参数就固定了,必须为实例类名,不像上一种方法那么灵活。
这两种方法各有各的优点,可根据实际情况自己选择。
下面介绍一下简单工厂模式中的角色与职责
简单工厂模式中包含的角色及其职责
1、工厂(Creater)角色
简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。(FruitFactory类)
2、抽象(Product)角色
简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。(Fruit接口)
3、具体产品(Concrete Product)角色
简单工厂模式所创建的具体实例对象。(Apple类与Banana类)
简单设计模式的优缺点:
- 优点:简单工厂模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界给定的信息,决定究竟应该创建哪个具体类的对象。用户在创建时可以直接使用工厂类去创建所需的实例,而无需去了解这些对象是如何创建以及如何组织的,明确区分了各自的职责和权力,有利于整个软件体系结构的优化。
- 缺点:很明显简单工厂模式的缺点也体现在其工厂类上,由于工厂类集中了所有实例的创建逻辑,容易违反GRASPR的高内聚的责任分配原则,另外,当系统中的具体产品类不断增多时,可能会出现要求更改相应工厂类的情况,拓展性并不是很好。
使用场景
java设计模式-----1、简单工厂模式的更多相关文章
- (1)java设计模式之简单工厂模式
一:简单工厂模式的优点 --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...
- Java 设计模式01 - 简单工厂模式
先要学习设计模式之前的先看看一些基础 UML类图简单说明 可以先看看我的这篇博客: UML类图简单说明,学习编程思路的必会技能 接下来才是重点,开始我们的旅程吧. 一.UML类图展示 我们要用简单工厂 ...
- Java设计模式(1)——简单工厂模式
简单工厂模式属于类的创建型模式,又叫做静态工厂方法模式.通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 一.模式中包含的角色及其职责 1.工厂(Creator)角色 简单 ...
- Java 设计模式之 简单工厂模式(静态工厂方法模式)
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的 ...
- java设计模式之简单工厂模式
简单工厂: 简单工厂的优点: 1.去除客户端与具体产品的耦合,在客户端与具体的产品中增加一个工厂类,增加客户端与工厂类的耦合 2.封装工厂类,实现代码平台的复用性,创建对象的过程被封装成工厂类,可以多 ...
- Java设计模式之【工厂模式】(简单工厂模式,工厂方法模式,抽象工厂模式)
Java设计模式之[工厂模式](简单工厂模式,工厂方法模式,抽象工厂模式) 工厂模式出现的原因 在java中,创建一个对象最简单的方法就是使用new关键字.但在一些复杂的业务逻辑中,创建一个对象不只需 ...
- 设计模式之简单工厂模式Simple Factory(四创建型)
工厂模式简介. 工厂模式专门负责将大量有共同接口的类实例化 工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类. 工厂模式有三种形态: 1.简单工厂模式Simple Factory ...
- Java 设计模式之抽象工厂模式(三)
原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...
- Java中的简单工厂模式
举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...
- C#设计模式(2)-简单工厂模式
引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...
随机推荐
- 常用SQL笔记总结
DDL(data definition language)创建和管理表 1.创建表 1.直接创建 例如: create table emp( name varchar(20), salary int ...
- 小白的Python之路 day5 logging模块
logging模块的特点及用法 一.概述 很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你 ...
- uwsgi常用配置
一.安装方式 1.wget 可以去官网:https://pypi.python.org/pypi/uWSGI/ 下载对应的版本 tar -xvf uwsgi-2.13.1.tar.gz cd uw ...
- 解决myeclipse10.1导出War包出错:Security Alert:Integrity check error
解决myeclipse10.1导出War包出错:Security Alert:Integrity check error 解决myeclipse10.1不能导出war包报 ============== ...
- Django_注册全局消息
需求: 对于登录用户,无论他在哪个页面,我都需要给他全局发送一个消息提示,Django中request就是一个全局变量 那,如何做? 在models 中urser表,继承user的表类中写上一个函数, ...
- Django_验证码
问题: 登录.注册.忘记密码时候,提交用户数据时候,需要用到用户填写验证码,如何生成验证码? 那,解决方法? 第三方模块 django-simple-captcha pip install djang ...
- 如何从零开始设计一款漂亮的移动APP?
以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 我13岁时开始学习平面设计.我从网上课程学会了设计网站,并习惯于全天使用Photoshop和Affi ...
- java 重写与重载
一.方法重写: 参数列表必须完全与被重写方法的相同: 返回类型必须完全与被重写方法的返回类型相同: 访问权限不能比父类中被重写的方法的访问权限更低.例如:如果父类的一个方法被声明为public,那么在 ...
- VNC配置
简介 VNC (Virtual Network Console)是虚拟网络控制台的缩写.它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 UNIX ...
- math对象与数组对象
1.math对象 属性 //PI 圆周率 方法 //random 随机数 var num= Math.random(); 生成0到1的随机数//round 四舍五入var num2 ...