java设计模式之——工厂模式
对于java的设计模式,我还是第一次认认真真的总结,以前用的时候都不曾留意细节,现在回头再看只知道该怎么设计,却忘记当时为嘛要用它了,
所以这次就做一个demo来再次复习总结一下,希望从中能学到新体悟。先说说设计模式最重要的一个原则吧,就是开闭原则:意思是对扩展开放,对修改关闭
在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。
想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。
1、简单的工厂模式
以小明,小雨吃饭睡觉为例:
首先创建一个Human.java接口,该接口的作用相当于女娲造人,它为人类定义了吃饭睡觉的能力
public interface Human {
public abstract void sleep();
public abstract void eat();
}
Xiaoming.java,实现了Human接口
public class Xiaoming implements Human {
public void sleep(){
System.out.println(" ----小明睡觉了---- ");
}
public void eat(){
System.out.println(" ----小明吃饭了!---- ");
}
}
Xiaoyu.java同上
public class Xiaoyu implements Human {
public void sleep() {
System.out.println("小雨睡觉了");
}
public void eat() {
System.out.println("小雨吃饭了");
}
}
最后我们建个工厂类HumanFactory.java
public class HumanFactory(){
public Human getHuman(String name){
if("Xiaoming".equals(name)){
return new Xiaoming();
}esle if("Xiaoyu".equals(name)){
return new Xiaoyu();
}else{
return null;
}
}
}
测试类:
public class HumanTest{
@Test
public void test1(){
HumanFactory provider = new HumanFactory();
Human xiaoming = provider.getHuman("xiaoming");
xiaoming.sleep();
}
}
输出:----小明睡觉了----
2、多个工厂模式
多个工厂模式是对简单工厂模式的改进,对HumanFactory.java做一下修改就可以了:
public class CarFactory {
public Car getXiaoming(){
return new Xiaoming();
}
public Car getXiaoyu(){
return new Xiaoyu();
}
}
测试类:
public class HumanTest{
@Test
public void test1(){
HumanFactory provider = new HumanFactory();
Human xiaoming = provider.getXiaoming();
xiaoming.sleep();
}
}
输出:----小明睡觉了----
3、静态 工厂模式,同样对HumanFactory.java做一下修改就可以了:
public class CarFactory {
public static Car getXiaoming(){
return new Xiaoming();
}
public static Car getXiaoyu(){
return new Xiaoyu();
}
}
测试类:
public class HumanTest{
@Test
public void test1(){
Human xiaoming = HumanFactory.getXiaoming();
xiaoming.sleep();
}
}
输出:----小明睡觉了----
总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
在以上的三种模式中,第一种如果传入的字 符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,
所以,大多数情况下,我们会选用第三种——静态工厂方法模式。
4、抽象工厂模式
同样的以Human为例:
首先创建同一接口:
public interface Human {
public abstract void sleep();
public abstract void wakeup();
}
一下两个类:
public class Xiaoming implements Human {
public void sleep(){
System.out.println(" ----小明睡觉了---- ");
}
public void wakeup(){
System.out.println(" ----小明醒了!---- ");
}
}
public class Xiaoyu implements Human {
public void sleep() {
System.out.println("小雨睡觉了");
}
public void wakeup() {
System.out.println("小雨睡醒了");
}
}
提供两个工厂类
public class XiaomingFactory implements FactoryProvider{
public Human produce() {
return new Xiaoming();
}
}
public class XiaoyuFactory implements FactoryProvider{
public Human produce() {
return new Xiaoyu();
}
}
实现同一个接口:
public interface FactoryProvider {
public Human produce();
}
测试类:
public class HumanTest{
@Test
public void test1(){
FactoryProvider provider = new XiaomingFactory();
Human xiaoming = provider.produce();
xiaoming.sleep();
}
}
输出:小明睡觉了。
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。
这样做,拓展性较好!
java设计模式之——工厂模式的更多相关文章
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
- java设计模式2————工厂模式
1.工厂模式介绍: 1.1.实现了创建者与调用者的分离 1.2.详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 1.3.所遵循的OOP原则: 开闭原则:对扩展开放,对修改关闭 依赖倒转原则:面向 ...
- java 设计模式之工厂模式与反射的结合
工厂模式: /** * @author Rollen-Holt 设计模式之 工厂模式 */ interface fruit{ public abstract void eat(); } ...
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式之-----工厂模式(简单工厂,抽象工厂)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类:1)简单工厂模式(Simple Factor ...
- Java设计模式之工厂模式(简单工厂模式+工厂方法模式)
摘自http://blog.csdn.net/jason0539/article/details/23020989 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是 ...
- java设计模式之一工厂模式
简单工厂模式是java设计模式中最简单的设计模式之一: 工厂模式是最常用的设计模式之一. 工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模 ...
随机推荐
- XBee模块户外通信距离测试
Digi的XBee模块在市面上同类产品中,除了稳定性和可靠性最受推崇外,在距离测试中一般都比竞争对手的产品略胜一筹.户外测试需要注意避免模块自身以外的因素造成的测试结果不理想. 2.4G的模块有Zig ...
- vue脚手架的使用
npm install -g @vue/cli --全局环境安装vue/cli vue create <project-name> 在创建项目时你会被提示选取一个 preset.你可 ...
- "hello,world"———C++入门有感
刚进入这所学校时,编程对于我来说应该算得上一个既熟悉又陌生的词语.虽然曾经耳边不断有人不断提到编程语言,C语言,程序猿等词语,但是作为一个外行人在来到这所学校之前,对于其中的奥秘还是没什么特别了解,仅 ...
- Springboot单例模式实战封装json转换
一.定义 保证一个类仅有一个实例,并提供一个全局访问点. 二.优点 (1)在内存里只有一个实例,减少了内存开销 (2)可以避免对资源的多重占用 (3)设置全局访问点,严格控制访问 ...
- 【翻译】从头开始写一个时间序列数据库-Writing a Time Series Database from Scratch
本文来自: https://fabxc.org/tsdb/, 如翻译有误,请纠正. 我是从事监控工作的.特别是Prometheus, 一个包含自定义的时间序列库以及集成Kuberntes的监控系统. ...
- Java File类与文件IO流总结
1.File类 File类被定义为“文件和目录路径名的抽象表示形式”,这是因为File类既可以表示“文件”也可以表示“目录”,他们都通过对应的路径来描述.通过构造函数创建一个File类对象,则该对象就 ...
- 关于http与https的注意点
背景:在一次项目生产上线中遇到地址在IOS版本的app中打不开或者接口请求不返回的情况,在安卓机和PC上表现正常,经排查,问题出在http请求上,原因详解 在早期PC上和安卓手机上比较不严格,在htt ...
- STM32的SWD调试进不了main函数
玩了那么久STM32,还没有用SWD调试过程序(一直都是用printf调试程序),觉得有些落后了,于是开始搞起了SWD调试. 很快通过查阅资料,知道了keil里面的配置和ST-Link与STM32的连 ...
- shell脚本颜色输出(实例未编辑)
颜色输出通过echo 输出,需要加-e echo -e "\033[背景颜色;字体颜色\033[0m" 背景颜色 40 设置黑色背景 41 设置红色背景 42 设置绿色背景 43 ...
- Codeforces831B Keyboard Layouts
B. Keyboard Layouts time limit per test 1 second memory limit per test 256 megabytes input standard ...