设计模式(Java语言)- 简单工厂模式
简单工厂模式有称为静态工厂模式,属于设计模式中的创建型模式。简单工厂模式通过对外提供一个静态方法来统一为类创建实例。简单工厂模式的目的是实现类与类之间解耦,其次是客户端不需要知道这个对象是如何被穿创建出来的,只需要调用简单工厂模式的方法来统一创建就可以了,从而明确了各个类的职责。
一、创建简单工厂模式的步骤
第一步:声明一个抽象类(接口),以及对应的抽象方法,由实现类分别去实现这个方法。
第二步: 创建具体实现类,实现抽象方法。
第三步:创建一个简单工厂类,声明一个静态方法,根据传入的不同的类型来确定创建抽象类的具体实现类。
第四步:客户端通过工厂类获取实例对象。
二、应用案例:
下面以制造手机为例子,在现实生活中可能有很多工厂可以创建不同品牌的手机,这些工厂可以根据不同的需求来创建不同的手机。根据上面的步骤,首先我们需要一个抽象类,所以我们需要知道不同品牌的手机其实都是属于手机这种类别,因此我们可以将手机抽出来做成一个抽象类:
/**
* 手机类
*/
public interface Phone {
//制造手机的方法,留给具体的实现类来制造
void create();
}
第二步我们需要开始制造不同品牌的手机了:
制造华为手机
public class Huawei implements Phone {
@Override
public void create() {
System.out.println("====正在制造华为手机======");
}
}
苹果手机
public class Iphone implements Phone {
@Override
public void create() {
System.out.println("====正在制造苹果手机======");
}
}
第三步我们需要创建一个工厂方法,返回手机类。具体制造什么品牌的手机,需要根据传进来的手机名字来决定,因此我们可以这么写:
public class SimpleFactory {
public static Phone createPhone(String name) {
if ("huawei".equals(name))
return new Huawei();
else
return new Iphone();
}
}
第四步,手机创建好了,我们就可以使用了,即客户端调用工厂方法创建对象实例
public class Client {
public static void main(String[] args) {
Phone huawei = SimpleFactory.createPhone("huawei");
huawei.create();
Phone iphone = SimpleFactory.createPhone("iphone");
iphone.create();
}
}
//输出结果
====正在制造华为手机======
====正在制造苹果手机======
到这里,简单工厂模式基本已经写完了,仔细看会发现这种方法创建对象违反了ocp原则,每次增加不同品牌手机的时候都需要在工厂方法里添加不同的条件判断。如果手机品牌越来越多,代码看起来非常臃肿,很不利于后期的代码维护。因此,我们改进一下,不要通过手机品牌名称来判断需要创建哪一中对象了,而是客户端想要创建什么对象,只需要传入具体的实现类就可以了,然后通过Java的反射来创建对象。
public class SimpleFactory2 {
public static Phone create(Class<? extends Phone> clazz) {
try {
return clazz.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
客户端调用
public class Client {
public static void main(String[] args) {
Phone huawei = SimpleFactory2.create(Huawei.class);
huawei.create();
Phone iphone = SimpleFactory2.create(Iphone.class);
iphone.create();
}
}
//运行结果
====正在制造华为手机======
====正在制造苹果手机======
经过修改之后,每次增加新的手机品牌时就不用修改工厂方法的逻辑了。但是,还是有一个问题,就是每次创建对象都是通过反射来创建的,所以在性能上是有一定的损耗的。
三、总结:
优点:
1、简单优化了软件体系结构,明确了各自功能模块的职责和权利
2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象
缺点:
1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了
2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现共产类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利
3、改进后的简单工厂模式主要是使用反射效率会低一些
设计模式(Java语言)- 简单工厂模式的更多相关文章
- java设计模式-----1、简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单来说 ...
- Java设计模式2:简单工厂模式
简单工厂模式 简单工厂模式是类的创建模式,又叫做静态工厂方法模式.简单工厂模式由一个工厂对象决定生产出哪一种产品类的实例. 为什么要使用简单工厂模式 原因很简单:解耦. A对象如果要调用B对象,最简单 ...
- java 之 简单工厂模式(大话设计模式)
以前只是看设计模式,每次看完都去理解一次,并没有手动去写代码,所以理解的还不是很深刻,最近查看框架源码,发现很多地方用到的都是设计模式,因为对设计模式理解的不够深刻,所以源码查看进度很慢!现在决定来温 ...
- Java设计模式学习记录-简单工厂模式、工厂方法模式
前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类 ...
- 设计模式(java)--简单工厂模式之女娲造人.水果农场
女娲抟土造人 话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面. 女娲造人,这就是简单工厂模式的应用. 首先,在这个造人的思 ...
- Java描述设计模式(02):简单工厂模式
本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景简介 1.引入场景 订餐流程简单描述 1).食品抽象类,规定食品的基础属性操作 2).鱼类,鸡肉类食品类扩展 3).订餐流程类,根 ...
- Java实现简单工厂模式
昨天看了一下设计模式,复习了一下简单工厂模式,做个笔记,浅淡一下我对简单工厂模式的理解.书上使用的是C#,因为我所学的是Java,所以本人就用Java实现了一遍.如果有讲的不对的地方,希望能够指出来. ...
- Java反射+简单工厂模式总结
除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...
- C#设计模式系列:简单工厂模式(Simple Factory)
1. 简单工厂模式简介 1.1 定义 简单工厂模式定义一个Factory类,可以根据参数的不同返回不同类的实例,被创建的实例通常有共同的父类. 简单工厂模式只需要一个Factory类. 简单工厂模式又 ...
- Net设计模式实例之简单工厂模式(Simple Factory Pattern)
一.简单工厂模式简介(Bref Introduction) 简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, ...
随机推荐
- 洛谷P1608 路径计数
题目简介 题目描述 给你一个N点M边的有向图,求第一个点到第n个点的最短路和最短路条数 题目分析 很明显直接Dijkstra求最短路,加一个最短路计数 如下: if(dis[y]>dis[x]+ ...
- 使用git如何规范地向主线提交代码
使用git向主干分支合并代码通常采用两种方式:第一种是merge,第二种是利用BeyondCompare等工具进行比对,将差异合并到主干: 通过merge合并代码出现冲突时,并不清楚谁的修改和谁的修改 ...
- java集合之linkedList链表基础
LinkedList链表: List接口的链接列表实现.允许存储所有元素(包含null).使用频繁增删元素. linkedList方法: void addFirst(E e) 指定元素插入列表的开头 ...
- windows与office激活
暴风官网:www.baofengjihuo.com
- Spring自定义日志注解
JDK1.5中引入注解,spring框架把java注解发扬光大 一 创建自定义注解 import java.lang.annotation.Retention; import java.lang.a ...
- element ui实现手动上传文件,且只能上传单个文件,并能覆盖上传。
element ui提供了成熟的组件场景,但实际工作中难免会遇到认(sha)真(diao)的产品.比如,最近遇到的,要求实现手动上传特定格式文件(用户点击“上传文件”按钮,确定之后,只是单纯选择了文件 ...
- 编程语言分类 + python解释器的安装 + jupyter的使用(day 02整理)
目录 一.昨日内容回顾 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么编程 二 计算机组成 (一) CPU (二) 存储器 (三) I/O设备 (四) 多核CPU ( ...
- 解决axios发送post请求,后端接收不到数据
https://segmentfault.com/a/1190000012635783
- int和string的相互装换 (c++)
int和string的相互装换 (c++) int转换为string 第一种方法 to_string函数,这是c++11新增的函数 string to_string (int val); string ...
- Alpha阶段--第七周Scrum Meeting
任务内容 本次会议为第六周的Scrum Meeting会议 召开时间为周日下午5点,在潮音餐厅召开,召开时间约为30分钟,对已经完成项目的总结和对今后项目设计的展望 队员 任务 张孟宇 “我的”界面代 ...