点击上方「蓝字」关注我们

工厂模式的实现主要分为三种,分别是简单工厂模式(Simple Factory)、工厂方法模式(Factory Method)和抽象工厂模式(Abastract Factory );但是简单工厂模式不属于23种GOF设计模式之一。工厂模式在各种开源框架里使用非常普遍,例如Spring框架大量使用工程模式。下面分别介绍一下这三种实现。

0x01:  简单工厂模式

简单工厂模式也被称为静态工厂模式;简单工厂模式可以将产品的使用和生产完全分开,客户端只需要知道需要什么产品,如何来使用产品就可以了,而具体的产品生产任务由具体的工厂类来实现。工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。类图如下

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。该模式中包含的角色及其职责:

  • 工厂(Creator)角色:简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

  • 抽象产品(IProduct)角色:简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

  • 具体产品(Concrete Product)角色:是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

抽象产品(IProduct)角色

public interface IFruit {/*** 种植水果方法*/void plant();
}

抽象产品(IProduct)角色

//实现种植苹果
public class Apple implements IFruit {public void plant() {System.out.println("种植苹果");}
}//实现种植橙子
public class Orange implements IFruit {public void plant() {System.out.println("种植橙子");}
}

具体产品(Concrete Product)角色

public class PlantFruitsFactory {public static IFruit plantFruit(String fruitType) {//这里使用的if判断,用switch一样的道理if ("Apple".equals(fruitType)){return new Apple();}else if ("Orange".equals(fruitType)){return new Orange();}else {return null;}}
}

测试用例

public class ClientCmd{public static void main(String[] args) {IFruit fruit = PlantFruitsFactory.plantFruit("Apple");fruit.plant();fruit = PlantFruitsFactory.plantFruit("Orange");fruit.plant();}
}

0x02: 工厂方法模式

工厂方法(Factory Method)模式的定义是一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅是负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。类图如下:

  • 抽象工厂(Creator)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

  • 具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

  • 抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

  • 具体产品(Concrete Product)角色:该角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

抽象产品(Product)角色

//抽象产品类
public abstract class IMessage{//抽象产品方法public void send();
}

具体产品(Concrete Product)角色

//继承抽象类实现产品EmailMessage类
public class EmailMessage extends IMessage{//实现抽象产品方法@Overidepublic void send(){System.out.println("send Email Message~~");}
}//继承抽象类实现产品SmsMessage类
public class SmsMessage extends IMessage{//实现抽象产品方法@Overidepublic void send(){System.out.println("send Sms Message ~~~ ");}
}

抽象工厂(Creator)角色

//工厂抽象类
public abstract class Factory {//抽象工厂方法public abstract IMessage createMessage();
}

具体工厂(Concrete Creator)角色

//具体工厂类EmailMessageFactory
public class EmailMessageFactory extends Factory {@Overidepublic IMessage createMessage() {System.out.println("生产了一个EmailMessage ");return new EmailMessage();}
}//具体工厂类SmsMessageFactory
public class SmsMessageFactory extends Factory {@Overidepublic IMessage createMessage() {System.out.println("生产了一个SmsMessage");return new SmsMessage();}
}

测试用例

//调用方代码
public class ClientCmd {public static void main(String[] args) {//产生一个Email工厂Factory factory = new EmailMessageFactory();factory .createMessage().send();//产生一个短信工厂factory = new SmsMessageFactory();orangeFactory.createMessage().send();}
}

0x03: 抽象工厂模式

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。在抽象工厂模式中,客户端不再负责对象的创建,而是把这个责任丢给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。并且当一系列相互关联的产品被设计到一个工厂类里后,客户端的调用将会变得非常简单,而且如果要更换这一系列的产品,则只需要更换一个工厂类即可。类图如下

抽象工厂模式中存在四种角色,分别是抽象工厂角色,具体工厂角色,抽象产品角色,具体产品角色

  • 抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。

  • 具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。

  • 抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。

  • 具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部充满了应用系统的商业逻辑。

抽象产品角色

//抽象形状类
public abstract class Shape {public abstract void sayShape();
}//抽象颜色类
public abstract class Color {public abstract void sayColor();
}

具体产品角色

//矩形类
public class Retangle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Retangle!");}
}//圆形类
public class Circle extends Shape {@Overidepublic void sayShape() {System.out.println("Hi, I'm Circle!");}
}//红色类
public class Red extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm Red!");}
}//白色类
public class White extends Color {@Overidepublic void sayColor() {System.out.println("Hi, I'm White!");}
}

抽象工厂角色

//抽象工厂类
public abstract class ShapeFactory {public abstract Shape createShape();public abstract Color createColor();
}

具体工厂角色

//红色的圆
public class RedCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new Red();}
}//白色的圆
public class WhiteCircleFactory extends ShapeFactory {@Overidepublic Shape createShape() {return new Circle();}@Overidepublic Color createColor() {return new White();}
}

测试用例 

public class ClientCmd {  public static void main(String[] args){  //红色的圆ShapeFactory factory = new RedCircleFactory();  factory.createShape().sayShape();  factory.createColor().sayShapeColor();  //白色的圆ShapeFactory factory = new WhiteCircleFactory();  factory.createShape().sayShape();  factory.createColor().sayShapeColor();  }
} 

扫码二维码

获取更多精彩

Java乐园

有用!分享+在看☟

工厂模式:一个即可简单实现,又可复杂实现的模式相关推荐

  1. 工厂三兄弟之简单工厂模式(二)

    2 简单工厂模式概述 简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下: 首先将需要创建的各种不同对象(例如各种不同的Chart ...

  2. 工厂三兄弟之简单工厂模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/9300337 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式, ...

  3. java之设计模式工厂三兄弟之简单工厂模式

    [学习难度:★★☆☆☆,使用频率:★★★☆☆] 工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式.本章将要学习的简单工厂模式是工厂方法模式的& ...

  4. 几种简单的设计模式:单例模式、代理模式、观察者模式、工厂模式

    设计模式的学习 2022-1-22 数据结构.算法.设计模式.为编程的内功,语言和工具则为招式. 所谓设计模式,就是编写代码的思想. 模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方 ...

  5. 《JAVA与模式》之简单工厂模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式.简单工厂模式是由一个工厂 ...

  6. 简单工厂模式练习:简单工厂模式在农场系统中实现

    目录 前言 一.简单工厂模式 二.农场系统创建 1.先新建一个包.类以及抽象类 2.键入各类中代码 1 抽象产品角色  Fruit 2 实现产品角色  Apple 3实现产品角色  Grape 4实现 ...

  7. 设计模式学习笔记(三)工厂模式中的简单工厂、工厂方法和抽象工厂模式之间的区别

    设计模式中的工厂模式(Factory Design pattern)是一个比较常用的创建型设计模式,其中可以细分为三种:简单工厂(Simple Factory).工厂方法(Factory Method ...

  8. 设计模式之3种工厂模式对比和简单介绍

    一.简单工厂模式 模式定义 简单工厂模式又称静态工厂模式.可以根据参数的不同返回不同类的实例.定义一个类来创建其它类的实例. 模式角色 简单工厂模式包含如下角色 Factory:工厂角色 Produc ...

  9. JAVA工厂模式优缺点_简单工厂模式、工厂模式和抽象工厂模式区别及优缺点

    各位小伙伴好,今天给大家主要介绍一下简单工厂模式.工厂模式和抽象工厂模式的区别及各自的优缺点. (本文实现语言为Python3) [前言] 众所周知今天所讲的内容是 设计模式的一类:对于设计模式这个概 ...

最新文章

  1. python用什么编译器较好-python用什么编译器
  2. 论IP地址在数据库中应该用何种形式存储
  3. 怎么把cad做的图分享给别人_干货在线 | 这20个CAD技巧值得收藏!
  4. 可变数组NSMutableArray
  5. 多线程数据下载(akshare)
  6. java标识符命名_Java标识符命名规则
  7. Java基础篇:如何使用 break 退出循环
  8. ks线切割编程系统3.13完整版-2次加密注册码
  9. android x86 ib,IB驱动安装
  10. 体脂数C语言switch,你真胖么 体脂率是什么 体脂率的计算方法
  11. 1.数字芯片后端设计小概述
  12. python 生信分析_生信分析之Python学习1
  13. 博客迁移到sunface.io
  14. 【备忘】零基础学习java学习路线,从菜鸟到大牛的视频教程
  15. XMind 2022 for Mac(思维导图软件)V12.0.3中文免费版
  16. springBoot企业微信引入会话存档SDK
  17. 林轩田机器学习基石--The Learning Problem
  18. 人工智能的未来--神经科学启发的类脑计算综述
  19. 12、字符(串)输入、输出
  20. 为什么越能干越忙碌越吃亏?这四点干货,说破职场微生态

热门文章

  1. Mac安装pkg包报错:安装失败 “安装器遇到了一个错误,导致安装失败,请联系软件制造商以获得帮助
  2. IDC报告指点中国大数据江山,华为云何以独占鳌头?
  3. idc商用台式计算机数据排名,IDC报告:台式机电商市场同比增长9.2%,高质量消费助力京东领跑...
  4. 通过实验带你了解降噪耳机的工作原理-道合顺大数据infinigo
  5. PHPMailer发送outlook日历邮件(会议邀请)
  6. 微信小程序常用知识点
  7. Ubuntu 20.04显卡驱、cuda和cudnn安装以及OpenCV3.3.1的加上openCL和cuda功能编译
  8. 尾随零 - LintCode
  9. 【自定义View】洋葱数学同款雷达图深入解析-RadarView
  10. 打开北京地税未能检测到服务器,启动时显示:检测公共组件login.dll时未能通过,公共组件可能被破坏。怎么解决这个问题,谢谢!...