设计模式(Java版)-创建型模式之简单工厂模式
前言:这段时间在学习设计模式,本人也是小菜一枚(所以写的如果有错误的地方请大大们给予指出)。这个东西也是我一直想学习的,从点点滴滴做起,记录下自己每天的领悟!
一、工厂模式的动机
- 在软件系统中,经常面临着“某个对象”的创建工作;由于需求的变化,这个对象经常面临着剧烈的变化,但是它却拥有比较稳定的接口。
- 如何应对这种变化?如何提供一种“封装机制”来隔离出“这个易变对象”的变化,从而保持系统中“其他依赖该对象的对象”不随着需求改变而改变?
二、不同的工厂模式
- 简单工厂
- 工厂方法模式
- 抽象工厂
注:简单工厂:一个具体工厂通过条件语句创建多个产品,产品的创建逻辑集中与一个工厂类。客户端通过传不同的参数给工厂,实现创建不同产品的目的增加新产品时,需要修改工厂类、增加产品类,不符合OCP原则。
工厂方法:一个工厂创建一个产品,所有的具体工厂继承自一个抽象工厂。客户端先创建不同产品的工厂,再由工厂创建具体产品,产品的创建逻辑分散在每个具体工厂类中。客户端只依赖于抽象工厂与抽象产品,不依赖任何具体的工厂与具体产品增加新产品时,需要增加工厂类和产品类,符合OCP原则。
抽象工厂:一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品的创建的逻辑分在在每个具体工厂类中。所有的具体工厂继承自同一个抽象工厂。客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。增加新的产品族时,需要增加具体工厂类,符合OCP原则。增加新产品时,需要修改具体工厂类和增加产品类,不符合OCP原则。如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以。
三、简单工厂模式
- 解释:简单工厂模式是创建型模式,用于对象的创建,它不属于23种gof设计模式。它是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
- 简单工厂模式的结构:
模式的结构中包括的角色:抽象产品(Product)
具体产品(ConcreteProduct)
构造者(Creator)
四、代码演示
这里我用的是一个这样的例子:用一个工厂来生产出不同类型的窗体(记住为同类产品)
1、在工厂模式中我们首先考虑的应该是产品,因为产品为窗体,所以我们抽象出的产品父类(即抽象产品Product)是所有窗体产品都有的特性 命名为Window.java对应的代码:
package com.java; /**
* 抽象的窗体类
*
* @author zhang
*
*/
public abstract class Window {
// 抽象的方法
public abstract void funct();
}
2、父级的产品写完以后就是考虑不同型号的同类(具体产品ConcreteProduct)产品了分别为WindowBig.java和WindowSmall.java
WindowBig.java对应的代码:
package com.java; /**
* 具体产品的类(大窗体)
* @author zhang
*
*/
public class WindowBig extends Window { @Override
public void funct() {
System.out.println("大窗体创建成功");
} }
WindowSmall.java对应的代码:
package com.java; /**
* 具体产品类(小窗体)
* @author zhang
*
*/
public class WindowSmall extends Window { @Override
public void funct() {
System.out.println("小窗体创建成功");
} }
3、当产品写完后就应该是对就的生产产品的工厂类(构造者Creator)了Factory.java
package com.java; /**
* 生产产品的工厂类
*
* @author zhang
*
*/
public class Factory {
// 创建窗体的方法
public Window CreateWidow(String type) {
if ("big".equals(type)) {
return new WindowBig();
} else if ("small".equals(type)) {
return new WindowSmall();
} else {
return new WindowBig();
}
}
}注:简单工厂最重要的就是Create方法,根据传入的字符来生产不同的对象(利用java的多态来实现)。
五、简单工厂模式优缺点
优点:简单工厂模式主要用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系会导致软件的脆弱。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
适合应用的场景:
- 工厂类负责创建的对象比较少
- 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心
- 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用
设计模式(Java版)-创建型模式之简单工厂模式的更多相关文章
- Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式
工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...
- C++设计模式 ==> 策略模式与简单工厂模式结合
简介 策略模式相较之于简单工厂模式适用于生产方法经常变化且方法较为繁多的情况,因为生产方法时常变化就会需要频繁修改工厂类,违背了开闭原则,这时就可以用策略选择类由客户端根据需求动态切换策略.且策略模式 ...
- 设计模式之策略模式&简单工厂模式
学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了.可是老认为没有学到什么,认识也不够深刻.如今趁着重构机房,再又一次来过,也不晚. 事实上在敲了机房之后,看看模式,事实上,曾经非常难理解. ...
- Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
设计模式系列参考: http://www.cnblogs.com/Coda/p/4279688.html 一.概述 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高 ...
- 设计模式(四):SIMPLE FACTORY简单工厂模式 -- 创建型模式
1.定义 简单工厂模式又称静态工厂方法模式.重命名上就可以看出这个模式一定很简单.它存在的目的很简单:定义一个用于创建对象的接口. 2.适用场景 如果一个客户要一款宝马车,一般的做法是客户去创建一款宝 ...
- 工厂模式之简单工厂模式,head first设计模式
简单设计模式比较简单,15分钟的时间,跟着我做,十几分钟学会简单设计模式,开始吧: 1.使用new实例化一个对象时,你肯定知道这种代码缺少弹性,绑定着具体的类会导致代码更加脆弱,简单工厂模式就是针对接 ...
- java面向接口编程之制定标准和简单工厂模式
制定一个标准,让别人去实现或者说满足它! Eg: interface USB{//定义USB标准 void useUSB();//USB有使用USB的行为 } 简单工厂模式 构建一个工厂出来,在里面进 ...
- Objective-C 工厂模式(上) -- 简单工厂模式
简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂 ...
- 六个创建模式之简单工厂模式(Simple Factory Pattern)
定义: 定义一个工厂类,它可以根据参数的不同生成对应的类的实例:被创建的类的实例通常有相同的父类.因为该工厂方法尝尝是静态的,所以又被称为静态工厂方法(Static Factory Method) 结 ...
随机推荐
- sublime开启php自动代码补全
配置文件添加 "auto_complete_selector": "source, text", 配置文件打开方式:preferences->settin ...
- Nagios配置—添加linux主机监控
nagios安装请参看:Nginx平台安装Nagios监控服务 下面是我添加linux监控机的过程,如有错误或者不当的地方请指出: 测试环境: 监控主机:nagios+nagios插件+nrpe+网站 ...
- IE6-BUG-CSS兼容详解
1.IE6背景闪烁 如果你给链接.按钮用CSS sprites作为背景,你可能会发现在IE6下会有背景图闪烁的现象.造成这个的原因是由于IE6没有将背景图缓存,每次触发hover的时候都会重新加载,可 ...
- js和jquery中有关透明度操作的问题
在日常开发的网站中,常常会用到设置透明度问题,最简单的就是图片的淡入淡出效果.下面我介绍一下在原生js和jQuery中设置透明度的相关问题和注意点: 1 透明度样式设置 透明度在IE浏览器 ...
- C#中串口与Modem的通信
C#中串口与Modem的通信 2007-08-20 09:52643人阅读评论(8)收藏举报 最近一段时间,试验了串口的数据传输.在C#中,其实有一个很好的类SerialPort使串口间的通信变得简单 ...
- Linux(CentOS)搭建SVN服务器全攻略
虽然在windows上搭建SVN很简单,但是效能却不高,这当然是和linux相比了.然而在linux上搭建SVN却非常繁琐,所以今天这篇文章就来一步一步教您如何在Centos上搭建SVN 安装#yum ...
- 按钮控件Button
钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push Button,Check Box,Radio Box.所以在利用CButton对象生成按钮窗口时需要指明按 ...
- Linux_service cloudera-scm-server start failed
see log : /var/log/cloudera-scm-server/cloudera-scm-server.log
- IOS面试攻略
IOS面试攻略(1.0) 2013-10-13 20:58:09| 分类: IOS面试 | 标签:ios知识点总汇 ios面试 |举报|字号 订阅 来自:伊甸网 @ 看到这个关键字,我 ...
- Spark 启动过程(standalone)
Spark启动过程 正常启动Spark集群时往往使用start-all.sh ,此脚本中通过调用start-master.sh和start-slaves.sh启动mater及workers节点. 1. ...