设计模式(4)-工厂模式

Zoop PHP框架 v1.5 Zoop PHP框架,意为Zoop面向对象的PHP框架。这是个稳定,可伸缩并可移植的框架。从诞生到现在的5年间,已经在不少产品开发中被使用。Zoop是一个快速,有效并干净的框架。它的伸缩性很好,你可以只安装你需要的功能。对代码并不很熟悉的开发者也可以通过Zoop快速的开发安全的web应用。熟练的开发者则可以更加将Zoop的弹性利用到极致。Zoop建议将display,logic以及数据层(MVC)分开使用。Zoop由很多组件和项目集合而成,其中包括smarty和prototype AJAX框架,PEAR模块等。高效的核心组件提供了很多你原本需要自己编码来实现的功能。Zoop内置的纠错功能可以通 立即下载


更多关于设计模式的文章请点击:设计模式之禅(0)-目录页


工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

一、简单工厂模式

1.1、单一new方式

我们在开发项目时如果需要获取对象,通常会使用单一new的方式去获取它:

	Object object1 = new Object1();
	Object object2 = new Object2();
	Object object3 = new Object3();

我们或许还会在创建出来后进行一些处理:

	Object object1 = new Object1();
	object1.setA(A);
	object1.setB(B);
	Object object2 = new Object2();
	object2.setA(A);
	object2.setB(B);
	Object object3 = new Object3();
	object3.setA(A);
	object3.setB(B);

这会暴露出一个问题:
所有的创建过程和固定的操作都需要写出来,并且在本地代码中将其暴露。这不符合写入不变的、封装变化的代码的设计模式,所以说,我们需要一个类似于工厂的角色去产生这些对象,并且对它们进行一些固定的操作。这样就自然而然地引出了简单工厂模式(Simple Factory Pattern)。

1.2、简单工厂模式

简单工厂模式(Simple Factory Pattern)的使用很简单,再拿我们的动物简单工厂来举例子:

public class SimpleAnimalFactory{
    public Animal getAnimal(String type){
        if(type.equals("Dog")){
      		Animal dog =  new Dog();
      		//处理dog
            return  dog ;
        }else if(type.equals("Cat")){
            Animal cat=  new Cat();
      		//处理cat
            return  cat;
        }
    }
}

当我们需要Dog时,只需要创建SimpleAnimalFactory,再用其调用getAnimal(“Dog”)即可获得一只"经过处理的狗",而且这些创建和处理对"调用者"来说是"不可见"的,调用者并不在乎工厂内部到底做了什么,只需要获得经过处理的对象。

那么,工厂模式就这样讲完了吗?当然不是。其实,简单工厂模式并不算是一种设计模式,工厂模式也远没那么简单。

二、抽象工厂及工厂方法

2.1、将简单工厂改造成抽象工厂

在上面的简单工厂中,我们所实现的SimpleAnimalFactory已经能帮助我们获得简单的动物了,但是当我们需要动物园的动物时,我们需要制造一个ZooAnimalFactory;同理,当我们需要野生动物时,我们需要WildAnimalFactory,我们可以这样写:

  • ZooAnimalFactory
public class ZooAnimalFactory{
  
    public Animal getAnimal(String type) {
        if(type.equals("ZooDog")){
            return new ZooDog();
        }else if(type.equals("ZooCat")){
            return  new ZooCat();
        }
        return null;
    }
}
  • WildAnimalFactory
public class WildAnimalFactory{
   
    public Animal getAnimal(String type) {
        if(type.equals("WildDog")){
            return new WildDog();
        }else if(type.equals("WildCat")){
            return  new WildCat();
        }
        return null;
    }
}

如果你需要其他各种各样的工厂,我们只能一遍又一遍地写着,那么为什么我们不能抽取出来一个动物工厂超类,让其他工厂去继承它,获得工厂所需的方法和属性呢?这就是抽象工厂:

  • AnimalFactory
public abstract class AnimalFactory {
    public abstract Animal getAnimal(String type);
    }
}

此时,我们的ZooAnimalFactory和WildAnimalFactory可以这样写:

  • ZooAnimalFactory
public class ZooAnimalFactory extends AnimalFactory{
  	@Override
    public Animal getAnimal(String type) {
        if(type.equals("ZooDog")){
            return new ZooDog();
        }else if(type.equals("ZooCat")){
            return  new ZooCat();
        }
        return null;
    }
}
  • WildAnimalFactory
public class WildAnimalFactory extends AnimalFactory{
   @Override
    public Animal getAnimal(String type) {
        if(type.equals("WildDog")){
            return new WildDog();
        }else if(type.equals("WildCat")){
            return  new WildCat();
        }
        return null;
    }
}
2.2、为抽象工厂中添加工厂方法

我们上面的抽象工厂已经可以满足基本的需求了,但是还有一点美中不足:工厂中的动物由getAnimal(String type)方法创建,这里头真正产生动物的代码没有被封装起来,这就是所谓的工厂方法,即真正产生出对象的方法,我们可以在抽象工厂中添加一个工厂方法createAnimal(String type),并且让子类去重写这个工厂方法。

  • AnimalFactory
/**
 * @Auther: ARong
 * @Date: 2018/11/25 19:34
 * @Description: 动物工厂超类
 */
public abstract class AnimalFactory {

    public Animal getAnimal(String type){
        //调用createAnimal方法,该方法由实现类去重写
        Animal animal = createAnimal(type);
        return animal;
    }

    protected abstract Animal createAnimal(String type);
}

三、工厂模式总结

以上工厂模式的类,可以用简单的UML关系图来表示:
在这里插入图片描述

  • AnimalFactory
/**
 * @Auther: ARong
 * @Date: 2018/11/25 19:34
 * @Description: 动物工厂超类
 */
public abstract class AnimalFactory {

    public Animal getAnimal(String type){
        //调用createAnimal方法,该方法由实现类去重写
        Animal animal = createAnimal(type);
        return animal;
    }

    protected abstract Animal createAnimal(String type);
}
  • ZooAnimalFactory
/**
 * @Auther: ARong
 * @Date: 2018/11/25 19:36
 * @Description: AnimalFactory的实现类
 */
public class ZooAnimalFactory extends AnimalFactory{


    //按需重写createAnimal方法
    @Override
    protected Animal createAnimal(String type) {

        if(type.equals("ZooDog")){
            return new ZooDog();
        }else if(type.equals("ZooCat")){
            return  new ZooCat();
        }

        return null;
    }
}
  • WildAnimalFactory
/**
 * @Auther: ARong
 * @Date: 2018/11/25 19:41
 * @Description: AnimalFactory的实现类,野生动物工厂
 */
public class WildAnimalFactory extends AnimalFactory{
    @Override
    protected Animal createAnimal(String type) {

        if(type.equals("WildDog")){
            return new WildDog();
        }else if(type.equals("WildCat")){
            return  new WildCat();
        }


        return null;
    }
}
  • Animal
/**
 * @Auther: ARong
 * @Date: 2018/11/17 11:08
 * @Description:动物的抽象类,定义动物的属性以及抽象行为和具体行为
 */
public abstract class Animal {
    //动物名称
    private String name;
    //定义run方法
    public abstract  void run();

    //get、set
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • ZooCat/ZooDog/WildCat/WildDog的代码不列出了

  • 测试

/**
 * @Auther: ARong
 * @Date: 2018/11/25 19:44
 * @Description: 动物工厂测试
 */
public class TestAnimalFactory {


    @Test
    public void getZooAnimal(){
        AnimalFactory zooAnimalFactory = new ZooAnimalFactory();
        Animal zooDog = zooAnimalFactory.getAnimal("ZooDog");
        zooDog.run();
    }


    @Test
    public void getWildAnimal(){
       AnimalFactory wildAnimalFactory = new WildAnimalFactory();
        Animal wildCat = wildAnimalFactory.getAnimal("WildCat");
        wildCat.run();
    }

}
watchdog,监控 redis 节点的状态 watchdog:监控 redis 节点的状态,并在主节点故障时启用从节点——这是一个高可用组件 立即下载

相关推荐

设计模式之禅之 工厂方法模式+策略模式

设计模式之禅之 工厂方法模式+策略模式 设计模式之禅之 工厂方法模式+策略模式

Java 链式编程

来自:https://www.cnblogs.com/sunxun/p/5375452.html效果:new Object().setA("A").setB("B")...  链式效果写法 : 基本就是每次返回一个对象本身,这样就能够去调用对象的方法和属性class Cat{ public String name; public int age; public void s...

zuozhiyoulaisam的专栏 343

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

UVM中uvm_factory类的功能和内部代码

uvm_factory 类是 UVM 中的核心类之一,它负责管理和创建 UVM 对象。uvm_factory::get() 方法用于获取 UVM 工厂对象的唯一实例,该实例可以用来创建和管理 UVM 对象。现在,f 变量可以用来访问 UVM 工厂对象的方法,例如,创建新的 UVM 对象或查找已有的 UVM 对象。uvm_factory::get() 方法是一个静态方法,用于获取 UVM 工厂对象的唯一实例。uvm_factory 类是 UVM 中的核心类之一,它负责管理和创建 UVM 对象。

minsixiang的博客 390

PPT| 公司网络安全意识培训 P73

近年来,随着互联网的不断发展,网络安全问题也日益凸显,各种网络安全事件层出不穷,对个人和企业的信息安全带来了巨大的威胁。针对这一现状,国家加强了对信息安全的保护,相继颁布了多项法律法规,其中最重要的就是网络安全法。本文将从网络安全法和其他相关法律入手,对信息安全的保护措施进行深入分析。 本人在四大咨询机构从事咨询工作多年,二十年一线数字化规划咨询经验,提供制造业数智化转型规划服务,顶层规划/企业架构/数据治理/数据安全解决方案资料干货. 该PPT共73页,原文获取及来源公众号:【智能制造数字化咨询】

waldensss的博客 1422

GEO生信数据挖掘实战:从临床信息提取到多维分组可视化(聚类与PCA)

本文以GSE1297数据集为例,详细讲解了GEO生信数据挖掘中临床信息提取与分组构建的实战流程。通过R语言解析样本元数据,利用字符串处理技术从文本中精准构建疾病与对照分组,并强调使用层次聚类图和PCA图进行可视化验证,确保分组合理性与分析可靠性,为后续差异表达等高级分析奠定坚实基础。

cheese的博客 361

6-6 Animal动物工厂 (20 分)

已知有如下Animal抽象类,请编写其子类Dog类与Cat类,另外再编写一个生产动物的Factory工厂类,具体要求如下。 已有的Animal抽象类定义: abstract class Animal{ private String name; //名字 private int age; //年龄 public abstract void info(); //返回动物信息 public abstract void speak(); //动物叫 publi

m0_62401120的博客 6785

Cesium实战:3DTiles模型分层分户抽屉效果实现全攻略(附完整代码)

本文详细解析了在Cesium中为3DTiles模型实现分层分户抽屉效果的核心原理与完整代码。通过“主-副双模型”策略,结合属性过滤与矩阵变换,开发者能够创建出可交互、可探索的动态建筑可视化效果,适用于数字孪生、智慧城市及BIM可视化等场景。

d6e7f8g9h的博客 296

Hdu3829 Cat VS Dog(最大独立点集)

Cat VS Dog Problem Description The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the child's like-animal is a

Jelly_acm的博客 3089

elegant(ELEctron Generation ANd Tracking)入门指南(1)

elegant (ELEctron Generation ANd Tracking),美国先进光子源(APS)所用的圆环加速器的模拟程。

qq_41106132的博客 1849

大模型在电力交易功率预测中的应用:短期,超短期,中长期的完整解决方案代码详解

本文介绍了基于大模型的电力交易功率预测系统,该系统覆盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1月)三个时间尺度。文章详细阐述了数据准备与特征工程,包括多源数据集成和特征重要性分析。在模型构建方面,采用了Temporal Fusion Transformer (TFT)模型进行超短期预测,Informer模型进行短期预测,以及N-HiTS模型进行中长期预测。此外,文章还探讨了概率预测与风险分析,并介绍了模型部署与交易策略集成的实现。最后,文章总结了系统的贡献,并展望了未来发展方向,如市

专注AI大模型,软件混淆,授权 1264

泛型-IMPORTANT

一

weixin_43374578的博客 665

ue 蓝图 c++ websocket 事件回调

ue 蓝图 c++ websocket 事件回调

jacke121的专栏 168

《Head First 设计模式·4工厂模式》评价

近期整合静态工厂、工厂方法和抽象工厂模式。因为我很厌恶DIP,所以仔细看了一下《Head First 设计模式·4工厂模式》。 一个字评价烂,两个字,超级烂。 这本书的行文风格,各有喜好,我不评价——虽然我不喜欢花里胡哨的插图等。我们看其内容。 不应该用new,这节没有问题。《识别变化的方面》给出一个很烂的例子。PizzaStore与Pizza。抽象类Pizza有一系列子类型如CheeseP...

yqj2065的博客 918

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

HeadFirst 设计模式学习笔记4--工厂模式

本文已搬家至【HeadFirst 设计模式学习笔记】4 工厂模式

gnuhpc的专栏 3620

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

设计模式之4种工厂模式总结

友情链接: 设计模式之简单/静态工厂模式设计模式之工厂方法模式设计模式之抽象工厂模式设计模式之建造者模式 ------------------------------ 工厂模式总结 工厂模式设计原则与设计目的 1、解耦, 2、工厂负责对象的创建 3、面向接口编程,程序员只管使用,直至其接口而不知其实现类 工厂模式对比: 简单/静态工厂模式:把所有对象的创建逻辑集中到一个(专业)类处...

小明的Java问道之路 4514

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

设计模式4——工厂模式

如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了 1.简单工厂模式 简单工厂模式并不是一个设计模式,反而是一种编程习惯。简单工厂模式就是将某种类的初始化全部交给工厂来执行,外部用户不用考虑内部的实现,只需要告诉工厂想要什么样就可以,工厂根据用户提供的信息,返回一个相应类的实例。 如图1,一个实现简单工厂模式的pizza店。 (1)Pizza是一个接口,有四种不同的pizza实现接口。 (2)...

可耳(keer)的博客 757

【设计模式总结】4、工厂模式——简单工厂

开始之前,必须得注明一下,简单工厂并不是设计模式,它是一种编程习惯,方便后续引入工厂方法模式和抽象工厂模式。 简单工厂: 简单工厂非常简单,就是将所有类型实例化封装成一个类,用于解决使用new很多,违背了针对接口编程设计原则的问题,这也是工厂模式的设计原因之一。 UML类图: Clien通过SimpleProductFactory取得Product实例。 SimpleProductFactory...

Alexander的博客 159

4、设计模式之工厂模式的演进

一、简单工厂 1、这段时间开始学习设计模式,刚刚把设计模式的工厂模式看了一下,我自己有了自己的总结。 首先是简单工厂模式的演进: 起初我们想创建什么类就直接new 比如: 某机构想创建课程,先创建Java课程和python课程,那么就写代码实现: JavaCourse javaCourse = new JavaCourse(); javaCourse.record(); // 录制Java课程 PythonCour

q17709583436的博客 333

4、设计模式之工厂模式

简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。

天空之蓝的博客 453

Java 设计模式 4 —— 工厂模式

工厂模式 定义 将对象实例的创建过程整合到另一个工厂对象中,用工厂对象创建对象来代替new。 工厂模式又可以分为:简单工厂、工厂方法模式、抽象工厂模式等。 简单工厂 简单工厂的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。严格意义上来说,简单工厂不在23种设计模式之中。 抽象意义上的关系图: 朱老板使用装饰者模式修改了自己的电脑店...

aaacccadobe的博客 354

专题4_设计模式:工厂模式

提供一个创建对象实例的功能,而无需关系具体实现。简单的说,就是让对象的创建过程交给一个专门创建对象的类来做。代码简单。集中管理创建逻辑,减少客户端荣誉代码。客户端只依赖抽象,降低耦合。优点:1,满足开闭原则。新增产品只需要增加具体产品、具体工厂。2,符合单一职责。每个具体工厂只需要创造一种产品。3,灵活扩展。可以自定义具体工厂。4,降低耦合。客户端只依赖抽象,不依赖具体类。缺点:1,类数量剧增。一个具体产品就需要一个具体的工厂。2,客户端需要明确具体使用哪个工厂。

2403_88625492的博客 1623

《HeadFirst设计模式》(4)——工厂模式

文章目录前言简单工厂模式工厂方法模式模式定义设计原则问题场景类图代码抽象工厂模式 前言 当我们使用new实例化具体类时,针对的是实现编程,而不是接口,这会让代码缺乏弹性。比如` Pizza chickenPizza = new chickenPizza(); 虽然左边使用了接口,但右面还是得建立具体类的实例。当有一群具体类并且需要运行时才确定需要实例化哪一个时,通常会写出如下代码: Pizz...

一生悬命的博客 351

Head First 设计模式笔记 4.工厂模式

这篇博客记录了`new`操作符新建对象不够灵活的问题,通过一个披萨系统讲解了简单工厂,工厂方法模式,抽象工厂模式。并对依赖倒置原则进行了简单的说明。

zhazha_hui的博客 318

设计模式 4 —— 工厂模式

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。本文从一个具体的例子逐步深入分析,来体会三种工厂模式的应用场景和利弊。 1. 简单工厂模式 该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象,其UML类图如下: 下面我们使用手机生产来讲解该模式: Phone类:手机标准规范

tanghuan0827的博客 118
上一篇: 设计模式(3)-装饰者模式
下一篇: 设计模式(5)-适配器模式
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BoringRong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值