首页 > 其他分享 >工厂方法

工厂方法

时间:2023-06-01 16:22:44浏览次数:49  
标签:Factory 工厂 Phone 产品 手机 方法 public

工厂方法模式(定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行)
工厂方法模式是对简单工厂模式的进一步抽象化,可以使系统在不修改原来代码的情况下引进新的产品,满足开闭原则。
优点:
1、用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
3、典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。

缺点:
1、每次增加一个产品时,都需要增加一个具体产品类和具体工厂类,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度
2、抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决

例子:以工厂生产华为手机和苹果手机为例,类图如下:
————————————————
D%L8CD3IK~NYGGV5U{_TUMI.png
工厂方法模式的主要角色如下
抽象工厂(Abstract Factory):提供创建实体对象的接口。
具体工厂(Concrete Factory):实现抽象工厂中创建实体对象的接口。
抽象产品(Abstract Product):为具体产品提供公共接口。
具体产品(Concrete Product):实现抽象产品所定义的接口,由具体工厂来创建,和具体工厂相对应。

代码实现如下

/**
 * 抽象工厂
 */
public interface Factory {
    // 生产手机
    Phone produce();
}

具体工厂

/**
 * 华为工厂
 */
public class HuaweiFactory implements Factory {
    @Override
    public Phone produce() {
        System.out.println("新华为手机");
        return new HuaweiPhone();
    }
}
/**
 * 苹果工厂
 */
public class AppleFactory implements Factory {
    @Override
    public Phone produce() {
        System.out.println("新苹果手机");
        return new ApplePhone();
    }
}

抽象产品

/**
 * 手机
 */
public interface Phone {
    // 打电话
    void call();
}

具体产品

/**
 * 华为手机
 */
public class HuaweiPhone implements Phone {
    @Override
    public void call() {
        System.out.println("用华为手机打电话...");
    }
}
/**
 * 苹果手机
 */
public class ApplePhone implements Phone {
    @Override
    public void call() {
        System.out.println("用苹果手机打电话...");
    }
}

测试

public class Test {
    public static void main(String[] args) {
        Factory huaweiFactory = new HuaweiFactory();
        Phone huaweiPhone = huaweiFactory.produce();
        huaweiPhone.call();
        Factory appleFactory = new AppleFactory();
        Phone applePhone = appleFactory.produce();
        applePhone.call();
    }
}
// 运行结果
新华为手机
用华为手机打电话...
新苹果手机
用苹果手机打电话...

标签:Factory,工厂,Phone,产品,手机,方法,public
From: https://www.cnblogs.com/s186/p/17449397.html

相关文章

  • 抽象工厂
    抽象工厂打破了工厂类和产品类(大类例如:手机、平板)这种一对一的关系。一个具体的工厂类可以产生多个大类的产品以往的工厂类不在只能生产单一的产品类了,例如:广东工厂可以生产手机以及口罩,手机厂不仅仅能生产小米手机还可以生产一加手机了代码示例......
  • 数组去重方法总结
    //基于单key或无key去重,单key一般是对象的id,无key就是元素本身是非对象exportfunctionuniqueArr(arr,key){letres;if(key){res=[...newMap(arr.map(t=>[t[key],t])).values()]}else{res=[...newSet(arr)]}returnre......
  • Python笔记:正则表达式方法
    正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大。得益于这一点,在提供了正则表达式的语言里,正则表达式的语法都是一样的,区别只在于不同的编程语言实现支持的语法数量不......
  • 常用的表格检测识别方法——表格结构识别方法 (下)
    常用的表格检测识别方法——表格结构识别方法(下)3.2表格结构识别方法 表格结构识别是表格区域检测之后的任务,其目标是识别出表格的布局结构、层次结构等,将表格视觉信息转换成可重建表格的结构描述信息。这些表格结构描述信息包括:单元格的具体位置、单元格之间的关系、单元格的行......
  • Mysql json数组解析方法
    一、背景在表job_position需要对json数组进行解析,查找json数组对象中的数据 首先想到查找mysql的关于json的函数,这边做个记录。二、解决方案2.1 JSON_EXTRACT(json字段,'$.属性名称')需要了解函数 JSON_EXTRACT(json_doc, path[, path]...)  从json中提取数据,JSON_E......
  • Java小白入门学习方法总结
    系统的整理了我自学Java的学习方法,希望对大家自学Java有帮助~首先,需要一套系统完整的学习教程,这里推荐可以到b站,我看的动力节点老杜的Java基础课,现在更新了最新版Java17的,可直接看最新版,小白无脑入,详细且全面学习地址:https://www.bilibili.com/video/BV1ig4y1c7kPJava小白学习......
  • 高阶函数处理字符串方法
    1、concat()用于将一个或多个字符串拼接成一个新字符串。来看下面的例子:letstringValue="hello";letresult=stringValue.concat("world");//可接收任意多个参数letres=stringValue.concat("world","!!");console.log(result);//"helloworl......
  • SaltStack介绍——SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的
    SaltStack介绍和架构解析简介SaltStack是一种新的基础设施管理方法开发软件,简单易部署,可伸缩的足以管理成千上万的服务器,和足够快的速度控制,与他们交流,以毫秒为单位。SaltStack提供了一个动态基础设施通信总线用于编排,远程执行、配置管理等等。SaltStack项目于2011年启动,年......
  • Java零基础学习方法总结
    系统的整理了我自学Java的学习方法,希望对大家自学Java有帮助~首先,需要一套系统完整的学习教程,这里推荐可以到b站,我看的动力节点老杜的Java基础课,现在更新了最新版Java17的,可直接看最新版,小白无脑入,详细且全面学习地址:https://www.bilibili.com/video/BV1ig4y1c7kPJava小白学习方法......
  • 渐变色Panel构造方法的重写
    #此类用于设置渐变色panelclassMyPanel(wx.Panel):def__init__(self,parent):wx.Panel.__init__(self,parent,wx.ID_ANY)self.SetBackgroundStyle(wx.BG_STYLE_PAINT)self.Bind(wx.EVT_PAINT,self.OnPaint)self.Bind(wx.EVT_SIZ......