设计模式(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

【MediaPipe实战】从零构建实时人脸关键点检测与表情分析系统

本文详细介绍了如何使用MediaPipe框架从零构建实时人脸关键点检测与表情分析系统。通过Python代码实现,系统能够精准检测468个3D人脸关键点,并实时分析用户表情,适用于智能交互应用。文章包含环境配置、核心实现、可视化技巧及性能优化等实战内容,帮助开发者快速掌握深度学习在计算机视觉中的应用。

weixin_30836759的博客 73

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

新手学习Vivado XDMA (1) - 配置详细分析

PCIe 在 Vivado XDMA 中的配置分析。

qq_18553915的博客 9711

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 719

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

Python爬虫实战:采集行业协会、研究机构等平台的政策文件列表与PDF链接批量收集系统,支持自动下载、分类归档和数据库管理(SQLite持久化存储)!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 642

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

1、使用Spark SQL查询Databricks:全面指南

本博客全面介绍了如何使用Spark SQL在Databricks平台上进行高效的数据查询与分析。内容涵盖SQL基础操作、数据过滤、复杂查询技巧、简单与高级计算、数据聚合、日期处理等核心主题,适合数据分析师、开发人员及SQL学习者。通过逐步讲解和实用示例,帮助读者掌握从入门到高级的SQL技能,并提供学习路径建议和免费代码资源,助力实际数据分析工作。

redis7keeper的博客 91

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录

《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。

546

泛型-IMPORTANT

一

weixin_43374578的博客 665

Linux系统安装部署Redis完整教程(图文详解)

最近需要在Linux服务器安装部署Redis,参考了网上很多的文章,比较零碎,所以我自己写了一篇完整的Redis安装部署文档,在部署Redis之前重装了我的华为服务器,就是为了给大家一步步阐述我的操作过程,配合图文进行讲解更加通俗易懂!

黄团团的个人博客 6694

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

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

yqj2065的博客 918

基于R-CNN深度学习的生活垃圾检测与分类系统:数据集、模型和UI界面的完整实现

我们将使用一个公开的垃圾分类数据集来训练我们的模型。一个常见的数据集是TACO数据集(Trash Annotations in Context),该数据集包含多种垃圾类别,适用于垃圾分类任务。TACO数据集中的图像标注了垃圾的类别以及其在图像中的位置,适合用于目标检测任务。图片数据:每张图片中包含不同种类的垃圾。标签文件:每个图像有相应的标签文件,标注了图像中垃圾的类别、位置(通常为边界框坐标)等信息。dataset/images/image1.jpgimage2.jpg......其中,

YOLO 1103

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

gnuhpc的专栏 3620

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

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

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

小明的Java问道之路 4514

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

设计模式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、付费专栏及课程。

余额充值