设计模式-----工厂模式

2023-10-28

一、工厂模式简介

工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代码耦合度,并且增强了系统的扩展性。

 

二、简单工厂模式

简单工厂模式:定义了一个创建对象的类,由这个类来封装实例化对象的行为(代码)。

简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码逻辑将会非常复杂。

interface People
{
    public function say();

}



class Man implements People
{
    public function say()
    {
        System.out.println("this is a man");
    }
}

class Women implements People
{
    public function say()
    {
       System.out.println("this is a woman");
    }
}



//简单工厂模式,根据传入的不同参数,创建不同的对象
class SimpleFactory
{
    public static People create(String name)
    {
    if (name == "man") {
            return new Man();
        } elseif (name == "women") {
            return new Women();
        }
    }
}



//测试
public static void main(String [] args){
    
    //通过工厂类创建man对象
    Man man=Simplefactory.create("man");
    //通过工厂类创建women对象
    Women women=Simplefactory.create("women");


}

优缺点分析:

简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

 

三、工厂方法模式

此模式中,通过定义一个抽象的核心工厂类,并定义创建产品对象的接口,创建具体产品实例的工作延迟到其工厂子类去完成。这样做的好处是核心类只关注工厂类的接口定义,而具体的产品实例交给具体的工厂子类去创建。当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。

interface People
{
    public function say();
}




class Man implements People
{
    public function say()
    {
        System.out.println(this is a man);
    }
}



class Women implements People
{
    public function say()
    {
        System.out.println(this is a man);
    }
}





//与简单工厂模式相比。区别在于,此处将对象的创建抽象成一个接口
interface CreatePeople
{
    public function create();
}


//生产男人的工厂
class FactoryMan implements CreatePeople
{
    public function create()
    {
        return new Man();
    }
}


//生产女人的工厂
class FactoryWomen implements CreatePeople
{
    public function create()
    {
        return new Women();
    }
}



public static void main(String [] args){
    FactroyMan factoryman=new FactoryMan();
    FactroyWommen factorywomen=new FactoryWomen();
    //通过生产男人的工厂生产男人
    Man man=factoryman.create();
    //通过生产女人的工厂生产女人
    Women women=factroywomen.create();
}



优缺点分析:

工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

 

四、抽象工厂模式

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

interface TV{
  public function open();
  public function watch();
}



class HaierTv implements TV
{
  public function open()
  {
     System.out.println("打开海尔电视");
  }

  public function watch()
  {
      System.out.println("观看海尔电视");
  }
}


class ChangHongTv implements TV
{
  public function open()
  {
     System.out.println("打开长虹电视");
  }

  public function watch()
  {
      System.out.println("观看长虹电视");
  }
}




interface PC{
  public function work();
  public function play();
}

class HaierPc implements PC
{
  public function work()
  {
      System.out.println("打开海尔电脑");
  }
  public function play()
  {
      System.out.println("玩海尔电脑");
  } 
}


class ChangHongPc implements PC
{
  public function work()
  {
      System.out.println("打开长虹电脑");
  }
  public function play()
  {
      System.out.println("玩长虹电脑");
  } 
}




abstract class Factory{
  abstract public static function createPc();
  abstract public static function createTv();
}



class HaierFactory extends Factory
{
  public static function createTV()
  {
      return new HaierTv();
  }
  public static function createPc()
  {
      return new HaierPc();
  }
}


class ChangHongFactory extends Factory
{
  public static function createTV()
  {
      return new ChangHongTv();
  }
  public static function createPc()
  {
      return new ChangHongPc();
  }
}



//测试
public static void main(String [] args){
    HaierFactory haierfactory=new HaierFactory();
    ChangHongFactory changhongfactory = new ChangHongFactory();
    haierfactory.createTV();
    haierfactory.createPc();
    changhongfactory.createTV();
    changhongfactory.createPc();
}

优缺点分析:

在上面的Factory抽象类中,定义了两个抽象方法,这两个抽象方法分别用来生产不同的产品(即由不同类实例化的对象)。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式-----工厂模式 的相关文章

  • codemirror 部分配置信息 中文解释

    介绍 CodeMirror是一款在线的支持语法高亮的代码编辑器 官网 http codemirror net 下载后 解压开到的文件夹中 lib下是放的是核心库和核心css 模式下放的是各种支持语言的语法定义 主题目录下是支持的主题样式 一

随机推荐

  • r语言练习题3

    r语言练习题3 选择题练习 1 创建R 的数据框的函数 2 R中和 或非分别表示为 3 round 3 475 digits 2 返回值为 4 用R语言绘制直方图的命令 4 1用R语言绘制柱形图的命令 4 2用R语言绘制饼图的命令 5 R中
  • 如何写好技术方案

    一 前言 作为一个技术开发者 特别是高级 资深开发 架构师等 往往会遇到根据需求撰写技术方案 那么如何撰写一篇好的技术方案设计 我们今天就来聊一聊这个话题 二 技术方案是否有必要 答案是肯定的 我见过太多由于前期规划不到位 甚至是没有技术方
  • WebGL解决中文字体过大的问题

    最近公司项目要转成Webgl格式 打包测试后发现会把字体文件一同打包进去 导致打包文件很大 打包了一个空场景 使用的字体是Window自带的微软雅黑 字体占用空间很大 后来发现Unity有一个自带的TextMesh Pro 也可以进行文字输
  • 在已安装windows11环境中利用EasyBCD引导安装Ubuntu22.04(无需U盘)

    一 下载 1 下载Ubuntu 放到C盘 官网下载https ubuntu com download desktop 2 下载EasyBCD 链接 https pan baidu com s 1 KDr6kmVKH2u43W6XKYURg
  • 随笔篇----比特的传输

    琐碎的知识又增加了 这是我觉的比较有意思的科普 解开了一些生活中的小疑问 例如 电话 网页 电视 这些信号怎么传递的 人们怎么就成了千里眼 顺风耳 本文目的为 简单科普我们生活周围的信息是如何传递 如果学过通信的朋友可以略过啦哈 关键词 A
  • 软件测试阶段的风险

    1 需求风险 2 测试用例风险 3 缺陷风险 4 代码质量风险 5 测试环境风险 6 测试技术风险 7 回归测试风险 8 沟通协调风险 9 其他不可预计的风险 软件测试常见的风险 主要有以下几点 1 需求风险 对软件需求理解不够准确 导致测
  • pyinstaller打包执行文件报错NameError: name ‘defaultParams‘ is not defined问题解决方案

    老猿Python博文目录 https blog csdn net LaoYuanPython 一 问题 最近在执行以前打包的一个PyQT程序时报错 错误信息如下 F coffeDog videoToGif dist video2Gif gt
  • 本地资源加载不了 file:// net::ERR_UNKNOWN_URL_SCHEME

    本地资源加载不了 file net ERR UNKNOWN URL SCHEME 解决 开发环境使用tsFile 生产环境使用file
  • 用git创建空白分支

    用git创建空白分支 许多时候 需要添加的分支的代码与原来的代码没有一点关系 若是我们创建分支的话 则会继承master原来的东西 此时可以创建一个空白的分支 git checkout orphan test 这个时候会有许多无关文件存在
  • arp攻击实验(一)用一条指令让对方瞬间无法上网

    前言 本实验主要是利用局域网主机在进行2 3层通信时 协议上的漏洞 利用ARP欺骗 造成局域网内主机通信的失败 本文摘自 泰泰博客 www taitaiblog com 更多相关资源可访问该网站 实现原理 其主要原理是局域网内的 攻击机 通
  • centos 7 中的对文件的基本操作

    在文件夹中创造文件 touch 未创建前 在当前文件夹创建后并查看 创造文件夹 mkdir 未创建前 创建之后并查看 如果需要一次创造多个文件夹时 需要用到参数 p 递归创建文件夹 并用命令tree查看文件的结构 文件的复制 cp 复制te
  • [转]OpenSynergy的COQOS Hypervisor SDK-实现仪表和车载信息娱乐系统共享显示

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com OpenSyn
  • python3[爬虫实战] 使用selenium,xpath爬取京东手机(上)

    当然了 这个任务也是从QQ群里面接过来的 主要是想提升自己的技术 一接过来是很开心的 但是 接完之后 写了又写 昨晚写了3小时 前提晚上写了2小时 搞的有些晚了 搞来搞去就卡在一个地方了 希望懂的大神们多帮忙指点一下 使用selenium
  • chatgpt赋能python:Python重写父类方法:在OOP编程中的应用

    Python重写父类方法 在OOP编程中的应用 在Python的面向对象编程范式中 继承是一种非常重要的概念 当我们声明一个类时 我们可以通过继承来扩展类的功能并避免重复编写代码 在这个过程中 很可能你会碰到需要重写父类方法的情况 本篇文章
  • java输出1-100之间不能被5整除的数,每五个一行

    public class HomeWork06 public static void main String args int count 0 for int i 1 i lt 100 i if i 5 0 System out print
  • 剑指 Offer II 033. 变位词组&剑指 Offer II 035. 最小时间差 -做题总结和心得(剑指offer进阶-哈希表部分)

    剑指 Offer II 033 变位词组 该题解法是hash sort 答案是评论区大佬写的 大体思路 创建一个哈希表 再将每个字符串变成字符数组 排序后若哈希表里不存在排序后的字符串 则创建索引 然后将原字符串放进对应索引的数组里 cla
  • cartographer 代码思想解读(7)-位姿估计器PoseExtrapolator实现

    cartographer 代码思想解读 7 位姿估计器PoseExtrapolator实现 pose extrapolator类定义 插入IMU数据 AddImuData 插入里程计数据 AddOdometryData UpdateVelo
  • Plotly可视化:TypeError: box() got an unexpected keyword argument ‘box_color‘

    一 问题描述 我用Plotly库进行可视化 import plotly express as px category orders month stage month end month middle month start fig px
  • C++ 鼠标点击的获取

    C 鼠标点击 首先一个比较常用的宏定义如下 define KEY DOWN VK NONAME GetAsyncKeyState VK NONAME 0x8000 1 0 使用KEY DOWN 鼠标事件 可以方便获取很多鼠标的事件 鼠标各个
  • 设计模式-----工厂模式

    一 工厂模式简介 工厂模式分为简单工厂模式 工厂方法模式和抽象工厂模式 它们都属于设计模式中的创建型模式 其主要功能都是帮助我们把对象的实例化部分抽取了出来 目的是降低系统中代码耦合度 并且增强了系统的扩展性 二 简单工厂模式 简单工厂模式