文章目录

  • 1、 简单工厂模式概述
    • 1.1、简单工厂模式核心组件
    • 1.2、简单工厂模式优缺点
  • 2、` Java`实现
    • 公共父类定义
    • 产品具体实现类
    • 简单工厂定义
    • 代码运行测试:
  • 3、 `Python`实现
  • 4、 `Go`实现

1、 简单工厂模式概述

简单工厂模式是一种创建模式,又称为静态工厂方法模式,但是需要注意的是它不属于GOF23种设计模式之一。

简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式家族中最简单的一种应用实现。

1.1、简单工厂模式核心组件

该模式中包含了核心的几个角色用于完成整体项目架构

  • 工厂(Creator)角色

    • 简单工厂模式的核心组件,负责完成创建实例的所有内部逻辑实现。该工厂实例的创建实例的方法外部可以直接调用用于创建需要的产品对象。
  • 抽象产品(Product)角色
    • 简单工厂模式用于可创建的所有对象的父类,负责描述所有实例公共的接口定义。
  • 具体产品(Concrete Product)角色
    • 简单工厂模式的创建目标,所有创建对象都是基于某个具体的实例。

具体的架构组件如下图所示:

1.2、简单工厂模式优缺点

优点:

工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点:

由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新类,则就需要改变工厂类了。当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;这些缺点在工厂方法模式中得到了一定的克服

2、Java实现

公共父类定义

package com.damu.pojo;/*** <p>项目文档: 产品抽象父类,公共接口定义</p>** @author 大牧* @version V1.0*/
public interface Computer {/*** 获取品牌信息* @return 电脑品牌信息*/String getInformation();
}

产品具体实现类

package com.damu.pojo.impl;import com.damu.pojo.Computer;/*** <p>项目文档:  产品具体实现</p>** @author 大牧* @version V1.0*/
public class HpComputer implements Computer {public String getInformation() {return "HP 惠普电脑 Inter CPU i7 / 8G";}}
-----------------------------------------------------
package com.damu.pojo.impl;import com.damu.pojo.Computer;/*** <p>项目文档: 产品具体实现</p>** @author 大牧* @version V1.0*/
public class DellComputer implements Computer {public String getInformation() {return "Alienware 2018 戴尔旗下外星人电脑";}}
-----------------------------------------------------
package com.damu.pojo.impl;import com.damu.pojo.Computer;/*** <p>项目文档: 产品具体实现</p>** @author 大牧* @version V1.0*/
public class AppleComputer implements Computer {public String getInformation() {return "MacOS 2018 苹果电脑";}}

简单工厂定义

package com.damu.factory;import com.damu.pojo.Computer;
import com.damu.pojo.impl.AppleComputer;
import com.damu.pojo.impl.DellComputer;
import com.damu.pojo.impl.HpComputer;/*** <p>项目文档: 简单工厂类,实现创建对象的方法</p>** @author 大牧* @version V1.0*/
public class SimpleFactory {/*** 工厂方法* @param brand 创建电脑的品牌* @return 返回创建好的对象*/public static Computer createComputer(String brand) {Computer computer = null;if ("HP".equals(brand)) {computer = new HpComputer();} else if ("MAC".equals(brand)) {computer = new AppleComputer();} else if ("DELL".equals(brand)) {computer = new DellComputer();}return computer;}
}

代码运行测试:

package com.damu;import com.damu.factory.SimpleFactory;
import com.damu.pojo.Computer;/*** <p>项目文档: TODO</p>** @author 大牧* @version V1.0*/
public class Main {public static void main(String[] args) {// 创建对应的电脑对象Computer computer = SimpleFactory.createComputer("DELL");System.out.println(computer.getInformation());Computer computer2 = SimpleFactory.createComputer("MAC");System.out.println(computer2.getInformation());}
}

运行结果如下:

Alienware 2018 戴尔旗下外星人电脑
MacOS 2018 苹果电脑

3、 Python实现

Python作为弱类型的脚本语言,本身就已经支持大量的设计模式,这里通过语法糖的形式还原设计模式的实现还原Java中的同类型设计模式。

"""
简单工厂模式实现
"""
import abcclass Computer(metaclass=abc.ABCMeta):"""产品公共父类"""@abc.abstractmethoddef get_information(self):raise NotImplementedError("当前方法必须在子类中实现.")class HpComputer(Computer):"""产品具体实现:惠普电脑"""def get_information(self):return "Hp 惠普电脑 8 CORES CPUS | 8G"class AsusComputer(Computer):"""产品具体实现:华硕电脑"""def get_information(self):return "ASUS 华硕品质 坚若磐石"class SimpleFactory:"""简单工厂类"""@classmethoddef get_computer(cls, brand):"""创建电脑的静态工厂方法:param brand: 品牌参数:return:  返回创建的电脑对象"""computer = Noneif brand == "HP":computer = HpComputer()elif brand == "ASUS":computer = AsusComputer()return computerif __name__ == "__main__":"""测试代码"""c1 = SimpleFactory.get_computer("HP")print(c1.get_information())c2 = SimpleFactory.get_computer("ASUS")print(c2.get_information())

4、 Go实现

定义产品抽象接口

/*
产品抽象接口*/
type Computer interface {/*获取信息的抽象方法*/GetInformation() string
}

定义具体产品信息

/*
结构体实现*/
type HpComputer struct {}
// 实现接口方法
func (hpComputer HpComputer) GetInformation() string {return "惠普电脑来一台"
}/*
结构体实现*/
type MacComputer struct{}
// 实现接口方法
func (macComputer MacComputer) GetInformation() string  {return "MacBoot Pro 2018 引领商务本潮流"
}

定义简单工厂,在工厂中根据不同的条件创建不同的对象

/*
简单工厂*/
type SimpleFactory struct {}
// 实现工厂方法
func (simpleFactory SimpleFactory) GetComputer(brand string) Computer  {var computer Computerswitch brand {case "HP":computer = new(HpComputer)case "MAC":computer = new(MacComputer)}return computer
}

测试代码:

func main() {// 创建一个工厂对象factory := new(SimpleFactory)// 通过工厂对象获取电脑产品实例hp := factory.GetComputer("HP")fmt.Println(hp.GetInformation())mac := factory.GetComputer("MAC")fmt.Println(mac.GetInformation())}

执行结果如下:

#gosetup
惠普电脑来一台
MacBoot Pro 2018 引领商务本潮流

大牧絮叨设计模式:简单工厂模式相关推荐

  1. 大牧絮叨设计模式:工厂方法模式

    文章目录 1. 工厂方法模式概述 1.1. 工厂方法模式核心组件 1.2. 工厂方法模式优缺点 2. `Java`实现 (1) 核心工厂声明 (2) 核心产品声明 (3) 产品具体实现 (4) 工厂具 ...

  2. 大牧絮叨设计模式:建造者模式

    文章目录 1. `建造模式` 概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java` 实现 2.1. 抽象建造者`Builder` 2.2. 内聚组件`Aggregation Product ...

  3. 大牧絮叨设计模式:原型模式

    文章目录 1. `原型模式`概述 1.1. 核心组件 1.2. 优点缺陷 2. `Java`实现 2.1. 原型抽象 2.2. 原型实现 2.3. 原型对象管理器 2.4. 消费者 2.5. `深.浅 ...

  4. JavaScript设计模式--简单工厂模式例子---XHR工厂

    JavaScript设计模式--简单工厂模式例子---XHR工厂 第一步,Ajax操作接口(目的是起一个接口检测作用) (1)引入接口文件 //定义一个静态方法来实现接口与实现类的直接检验 //静态方 ...

  5. 三角形圆形创建与擦除java_设计模式---------------简单工厂模式

    设计模式---------------简单工厂模式 一.题目(Question) 使用简单工厂模式设计一个可以创建不同几何形状(如圆形.方形和三角形等)的绘图工具,每个几何图形都要有绘制draw()和 ...

  6. 设计模式—简单工厂模式

    前言 简单工厂模式是一种比较容易理解的设计模式 简单工厂模式介绍 在设计模式中,简单工厂模式可以理解为负责生产对象的一个类,当使用new 关键字创建一个对象时,此时该类就依赖于这个对象,也就是他们间的 ...

  7. 设计模式 - 简单工厂模式

    文章目录 设计模式 - 简单工厂模式 1.意图 2.实例 1.创建颜色接口 - 定义生产的产品是什么 2.创建颜色枚举 - 定义生产哪些类型的产品 3.根据颜色枚举创建产品 - 根据产品清单生产产品 ...

  8. 设计模式 -- 简单工厂模式

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识简单 ...

  9. Spring常用设计模式--简单工厂模式

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来:   在现实生活中我们都知道,原始社会自给自 ...

最新文章

  1. python中turtle画酷炫图案-酷炫的动态可视化交互大屏,用Excel就能做!
  2. 北斗导航 | 北斗三号全球导航卫星系统6类服务测试评估
  3. mysql 权重 取值_mysql如何按权重查询数据啊?
  4. jsf 自定义属性_如何在JSF中实现自定义密码强度指示器
  5. LeetCode 36. 有效的数独(哈希)
  6. 我把自己的下半生用来写程序
  7. matlab 二值化_基于MATLAB的指纹识别系统[GUI界面+万字技术文档+语音播报]
  8. Qt5.7+Opencv2.4.9人脸识别(一)项目介绍
  9. 学习CodeIgniter框架之旅(二)继承自定义类
  10. H3C DHCP中继和RIP配置实验
  11. 【新书推荐】【2019.01】离散数学及其应用(第五版)
  12. Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
  13. uipath sequence传递参数_湛江压铸模温机工作原理参数图
  14. BZOJ 3262: 陌上花开 (CDQ分治)
  15. pikachu SQL 注入(皮卡丘漏洞平台通关系列)
  16. Wi-Fi基带芯片和Wi-Fi无线网卡设计方案
  17. Sentinel限流规则使用总结
  18. 三个媒体发布平台大数据总结,为你分析爆文写作方向
  19. 一个项目中两台西门子S7-1500CPU之间的TCP通信组态
  20. 有些人想成功,有些人渴望成功,有些人努力实现成功

热门文章

  1. BGI-College生信入门——8、R语言基础(一)
  2. vivado 配置matlab,Matlab vivado
  3. python抢票系统代码及解说_python抢票程序
  4. 对口升学计算机试卷分析,语文试卷分析
  5. pvs-stdio ue4_通过PVS-Studio分析仪进行RunUO检查
  6. SQL server 2008 R2 图文安装教程(附资源)
  7. input正则邮箱_邮箱的正则表达式验证
  8. SparkSQL 概述
  9. USB存储设备(如:U盘,移动硬盘)
  10. 常用的统计学原理及案例