一篇博客读懂设计模式之—工厂模式

工厂模式在我们日常开发的时候经常用到,相信大家都有了一定的了解,工厂模式是一种创建对象的设计模式,它提供一种创建对象的最佳方式。

主要过程是: 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

工厂模式主要有常见的三种类型:简单工厂模式,工厂方法模式,抽象工厂模式。下面我们分别用代码来介绍一下这三种模式的演化过程:

简单工厂模式

  1. 添加一个接口
public interface Car {String getBrand();
}
  1. 添加几个实现类实现接口
public class Bmw implements Car {@Overridepublic String getBrand() {return "BMW";}
}
public class Benz implements Car {@Overridepublic String getBrand() {return "Benz";}
}
public class Audi implements Car{@Overridepublic String getBrand() {return "Audi";}
}
  1. 添加一个方法来选择创建的对象
//todo:1 简单工厂模式,虽然代码很简单,但是一个工厂怎么可能生产这么多不同的产品,不太符合规律,所以有了工厂方法模式
public class SimpleFactory {public Car getCar(String name){if("BMW".equalsIgnoreCase(name)){return new Bmw();}else if("Benz".equalsIgnoreCase(name)){return new Benz();}else if("audi".equalsIgnoreCase(name)){return new Audi();}else{return null;}}
}
  1. 添加测试类:
public class TestSimpleFactory {public static void main(String[] args) {SimpleFactory simpleFactory = new SimpleFactory();Car car = simpleFactory.getCar("");System.out.println(car.getBrand());}
}

工厂方法模式:

  1. 添加一个工厂的接口
//todo:2 工厂方法模式,通过接口来实现,不过这有个不足,我们消费者得自己知道用哪个工厂来进行生产
public interface Factory {Car getCar();
}
  1. 实现接口的工厂类
public class AudiFactory implements Factory {@Overridepublic Car getCar() {return new Audi();}
}
public class BenzFactory implements Factory {@Overridepublic Car getCar() {return new Benz();}
}
public class BmwFactory implements Factory{@Overridepublic Car getCar() {return new Bmw();}
}
  1. 测试类:
public class TestFuncFactory {//这种模式也有点问题,工厂模式的好处是让使用者更加方便,但是这种模式还要我们知道是要用哪个工厂来创建,这也太不智能了吧,所以就有了抽象工厂public static void main(String[] args) {System.out.println(new BenzFactory().getCar());System.out.println(new BmwFactory().getCar());System.out.println(new AudiFactory().getCar());}
}

抽象工厂方法: 整合了前面两种模式

  1. 添加一个抽象工厂
//todo:3. 抽象工厂方法模式,利用抽象类来实现,综合了工厂方法和简单工厂方法两种模式的优缺点
public abstract  class AbstractFactory {abstract Car getCar();public Car getCar(String name){if("BMW".equalsIgnoreCase(name)){return new BmwFactory().getCar();}else if("Benz".equalsIgnoreCase(name)){return new BenzFactory().getCar();}else if("audi".equalsIgnoreCase(name)){return new AudiFactory().getCar();}else{return null;}}
}
  1. 添加一个默认实现类
//因为抽象类不能直接实例化,所以这里添加了一个默认类来实现抽象类的其他方法
public class DefaultFactory extends AbstractFactory {@OverrideCar getCar() {return new BenzFactory().getCar();}
}
  1. 测试类
public class TestAbstrFactory {public static void main(String[] args) {DefaultFactory defaultFactory = new DefaultFactory();System.out.println(defaultFactory.getCar("bmw"));}
}

**

后期会继续完善 欢迎留言点赞!!

**

教你如何一篇博客读懂设计模式之—--工厂模式相关推荐

  1. 教你如何一篇博客读懂设计模式之—--原型模式

    教你如何一篇博客读懂设计模式之----原型模式 what:是什么 原型模式: 用于创建重复的对象,既不用一个属性一个属性去set和get,又不影响性能,原型模式产生的对象和原有的对象不是同一个实例,他 ...

  2. 一篇博客读懂设计模式之---工厂模式

    设计模式之-工厂模式 工厂模式: 创建过程: 创建Shape接口 public interface Shape {void draw(); } 创建实现类: public class Circle i ...

  3. 一篇博客读懂设计模式之---委派模式

    一篇博客读懂设计模式之-委派模式 委派模式可能大家听起来不太熟悉,但是在代码开发的时候却很好用,下面从几个方面来介绍一下 what:是什么? 委派模式:顾名思义,委托其他对象或者实例来帮我们完成任务, ...

  4. 一篇博客读懂设计模式之---模板方法模式

    设计模式之模板方法模式: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 简而言之就是:父类定义了骨架(调用哪些方法及其 ...

  5. 一篇博客读懂设计模式之-----策略模式

    设计模式之策略模式 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的对象 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决:在有多种算法相似的情况下 ...

  6. 一篇博客读懂设计模式之---动态代理与反射

    一篇博客读懂设计模式之---动态代理与反射 先来讲一下反射: 1 关于反射 反射最大的作用之一就在于我们可以不用在编译时就知道某个对象的类型,而在运行时通过提供完整的"包名+类名.class ...

  7. 一篇博客读懂设计模式之---单例模式

    一篇博客读懂设计模式之---单例模式 一.  单例模式 单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处 ...

  8. [入门篇]用史上最生动的方式让你一篇博客搞懂Linux进程地址空间,包看包懂!

    目录 0.前言 1.初始程序的地址空间划分 1.1程序地址空间图解 1.2程序地址空间区域划分验证 1.3 程序地址空间小补充 1.4 引入进程地址空间 *2. 两个生动的例子理解进程地址空间 2.1 ...

  9. Linux - 一篇带你读懂 Curl Proxy 代理模式

    curl 是一个很有名的处理网络请求的 类Unix 工具.出于某种原因,我们进行网络请求,需要设置代理.本文讲全面介绍如何为 curl 设置代理 设置代理参数 基本用法 -x, --proxy [pr ...

最新文章

  1. Windows10编译源码安装Aleth(Ethereum C++ client, tools and libraries)
  2. 【Kali渗透全方位实战】使用Nmap进行端口探测-发现脆弱站点
  3. 拔掉 MacBookPro,用 8GB 树莓派4 工作一天,体验原来是这样的
  4. java之arr.toString()与Arrays.toString(arr)区别
  5. VS|Qt工作笔记-修改pro文件生成目录清晰的项目结构并添加三方库
  6. android侧滑菜单ui,Android:UI控件DrawerLayout、Fragment、SlidingLayout侧滑菜单
  7. 斥候密报_斥候密报《最强王者》三国幕后巾帼之黄月英_吉吉建站手游网
  8. vue移动端点击事件延迟_去除点击事件300ms延迟 (使用了vue之后)
  9. 挑选回文串(二进制枚举)
  10. 浙江财经大学是一所怎样的学校?
  11. rocketmq消费
  12. gis 联合 融合_GIS空间数据融合方法
  13. 中职计算机应用基础表格制作说课稿,表格制作说课稿.doc
  14. windows安装hadoop教程,带截图
  15. C++游戏编程--模拟键盘打字程序
  16. 嵌入式产品如何支持阿拉伯文显示---看这一篇就够了
  17. 随笔:数据库SQL执行顺序
  18. 【开源工程】STM32C8T6+ADC信号采集+OLED波形显示
  19. Java高并发系列5-线程池
  20. Java实现一个订餐外卖系统

热门文章

  1. Java SecurityManager checkAccess()方法与示例
  2. 分布式映射与集中式映射_K映射上的表达式映射和组包围
  3. 看故事学知识,这篇Java代理的文章妙啊!
  4. 面试必备的分布式事物方案
  5. Win10中如何找到并打开SqlServer2008 R2配置管理器
  6. java通过POI技术将html转成word
  7. 一个柱状图里两种数据_分享一些数据分析常用的统计图图表
  8. graphpad prism画折线图_如何用Graphpad Prism 8作折线图
  9. c mysql 双主复制_mysql双主复制及使用keepalived作高可用的配置详解
  10. 大地win11 64位官方版镜像v2021.07