Day1 工厂模式
我的理解就是:工厂模式可以不用在乎参数的类型,工厂函数根据不同的类型,创建不同的对象。如下(简单工厂):
package method.simpleFactory;
import java.util.logging.Logger;
class LoggerFactory {
//静态工厂方法
public static Logger createLogger(String args) {
if(args.equalsIgnoreCase("db")) {
//连接数据库, 代码省略
//创建数据库日志记录器对象
Logger logger = new DatabaseLogger();
//初始化数据库日志记录器, 代码省略
return logger;
}
else if(args.equalsIgnoreCase("file")) {
//创建日志文件
//创建文件日志记录器对象
Logger logger = new FileLogger();
//初始化文件日志记录器, 代码省略
return logger;
}
else {
return null;
}
}
}
用于根据所传入的参数创建各种不同类型的日志记录器。 通过使用简单工厂模式, 我们将日志记录器对象的创建和使用分离,
客户端只需使用由工厂类创建的日志记录器对象即可, 无须关心对象的创建过程, 但是我们发现, 虽然简单工厂模式实现了对象的创建和使用分离,
但是仍然存在如下两个问题:
(1) 工厂类过于庞大, 包含了大量的if…else…代码, 导致维护和测试难度增大;
(2) 系统扩展不灵活, 如果增加新类型的日志记录器, 必须修改静态工厂方法的业务逻辑, 违
反了开闭原则
工厂模式代码如下:
一个工厂类只负责一个具体类的创建:
package method.factory;
//日志记录器接口:抽象接口
interface Logger{
public void writeLog();
}
//数据库日志记录器:具体产品
class DatabaseLogger implements Logger{
public void writeLog(){
System.out.println("数据库日志记录:");
}
}
// 文件日志记录器 具体产品
class FileLogger implements Logger{
public void writeLog(){
System.out.println("文件日志记录");
}
}
// 日志记录器工厂接口:抽象工厂
interface LoggerFactory{
public Logger createLogger();
}
//数据库日志记录器工厂类,具体工厂
class DatabaseLoggerFactory implements LoggerFactory{
public Logger createLogger(){
//连接数据库,代码省略
//创建数据库日志记录器对象
Logger logger = new DatabaseLogger();
//初始化数据库日志记录器,代码省略
return logger;
}
}
//文件日志记录器工厂:具体工厂
class FileLoggerFactory implements LoggerFactory{
public Logger createLogger(){
//创建文件日志记录器对象
Logger logger = new FileLogger();
return logger;
}
}
//客户端测试代码
class Client{
public static void main(String arg[]){
LoggerFactory factory;
Logger logger;
factory =new FileLoggerFactory();
logger = factory.createLogger();
logger.writeLog();
}
}
总结
工厂方法模式的主要优点如下:
(1) 在工厂方法模式中, 工厂方法用来创建客户所需要的产品, 同时还向客户隐藏了哪种具体
产品类将被实例化这一细节, 用户只需要关心所需产品对应的工厂, 无须关心创建细节, 甚
至无须知道具体产品类的类名。
(2) 基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。 它能够让工厂可以自主确
定创建何种产品对象, 而如何创建这个对象的细节则完全封装在具体工厂内部。 工厂方法模
式之所以又被称为多态工厂模式, 就正是因为所有的具体工厂类都具有同一抽象父类。
(3) 使用工厂方法模式的另一个优点是在系统中加入新产品时, 无须修改抽象工厂和抽象产品
提供的接口, 无须修改客户端, 也无须修改其他的具体工厂和具体产品, 而只要添加一个具
体工厂和具体产品就可以了, 这样, 系统的可扩展性也就变得非常好, 完全符合“开闭原则”。
Day1 工厂模式的更多相关文章
- 23种设计模式--工厂模式-Factory Pattern
一.工厂模式的介绍 工厂模式让我们相到的就是工厂,那么生活中的工厂是生产产品的,在代码中的工厂是生产实例的,在直白一点就是生产实例的类,代码中我们常用new关键字,那么这个new出来的实例 ...
- javascript工厂模式和构造函数模式创建对象
一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创 ...
- PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)
一.什么是抽象工厂模式 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件: 系统中有多个产品族,而系统一次只可能消费其中一族产品. 同 ...
- PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
最近天气变化无常,身为程序猿的寡人!~终究难耐天气的挑战,病倒了,果然,程序猿还需多保养自己的身体,有句话这么说:一生只有两件事能报复你:不够努力的辜负和过度消耗身体的后患.话不多说,开始吧. 一.什 ...
- 设计模式之工厂模式VS抽象工厂
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- 菜鸟理解的工厂模式(Factory Pattern)是什么样子的?
直接开始说了,不浪费园友宝贵的时间! 什么是工厂模式? 在学习前,先问一下:"它是什么?". 工厂模式,它是项目里面常用的设计模式之一. 它是属于创建型模式,简单的理解创建型模式就 ...
- PHP 面向对象编程和设计模式 (3/5) - 单例模式和工厂模式
PHP高级程序设计 学习笔记 2014.06.11 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容 ...
- 《JS设计模式笔记》构造函数和工厂模式创建对象
工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...
- 从接口、抽象类到工厂模式再到JVM来总结一些问题
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 涉及到的知识点总结如下: 为什么使用接口? 接口和抽象类的区别 简单工厂模式总结 Java中new和newInstance的区别 J ...
随机推荐
- python-flask模块注入(SSTI)
前言: 第一次遇到python模块注入是做ctf的时候,当时并没有搞懂原理所在,看了网上的资料,这里做一个笔记. flask基础: 先看一段python代码: from flask import fl ...
- sbt package报错:a bytes-like object is required, not 'str'
Traceback (most recent call last): File , in <module> s.sendall(content) TypeError: a bytes-li ...
- Python 用户输入&while循环 初学者笔记
input() 获取用户输入(获取的都是字符串哦) //函数input()让程序停止运行,等待用户输入一些文本. //不同于C的是可在input中添加用户提示,而scanf不具备这一特性. //提示超 ...
- windows10使用任务计划提醒自己
转载自:https://www.cnblogs.com/yourstars/p/6505991.html 利用Win10计划任务 + 弹窗,提醒你自己 步骤: 1.打开Win10控制面板 -> ...
- select count(1)和select count(*)的区别
select count(1) from 表a //查询时会对常数列进行统计行数select count(*) from 表a //查询时会找表a中最短的列进行统计行数 因为使用count(*)查询会 ...
- linux查看防火墙状态和对外开放的端口状态
1.查看防火墙状态 查看防火墙状态 systemctl status firewalld 开启防火墙 systemctl start firewalld ...
- mybatis插入嵌套对象
今晚做项目遇上了一个需求,需要插入嵌套对象. 对象结构是这样的: public class RegisterMsg{ private Header header; private short pro ...
- 将Ubuntu软件更新的源,换城阿里源
阿里云镜像: https://developer.aliyun.com/mirror/ 简介 Ubuntu,是一款基于 Debian Linux 的以桌面应用为主的操作系统,内容涵盖文字处理.电子邮件 ...
- BZOJ3473&&BZOJ3277串
BZOJ3473&&BZOJ3277串 题面 自己找去 HINT 对于所有串建立一个广义后缀自动机,对于每一个节点开一个set表示这个节点接受的子串在哪些串里出现过,然后在parent ...
- list类型的应用场景 —— Redis实战经验
list类型是简单的字符串列表,按照插入顺序排序.每个列表最多可以存储 232 - 1 个元素(40多亿) ,list类型主要有以下应用场景.. 1. 消息队列 list类型的lpop和rpush(或 ...