设计模式之工厂模式(Factory)

以boost factory & boost function实现对象工厂设计模式   本文介绍以boost factory & boost function实现C++对象工厂设计模式 阅读详情

设计模式之工厂模式

简介

工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。该模式用于封装和管理对象的创建,是一种创建型模式。

任何可以产生对象或者方法的类 ,都可以称之为工厂

单例也是工厂,可以把他当做静态工厂

为什么有了new 之后,还要有工厂

  1. 可以灵活控制生产过程
  2. 权限,修饰,日志。

代码准备

需求一

任意订制交通工具,例如汽车,飞机,扫把

  1. 新建父类接口
public interface Moveable {
    void go();
}
  1. 新建汽车,飞机,扫把类
public class Car implements  Moveable {

    @Override
    public void go() {
        System.out.println("Car is going ....");
    }
}


public class Plane implements Moveable {
    @Override
    public void go() {
        System.out.println("plane is flying....");
    }
}

public class Broom implements Moveable{

    @Override
    public void go() {
        System.out.println(" broom is jumping.....");
    }
}
  1. 新建Main类, 调用以上方法
public class Main {
    public static void main(String[] args) {
        //这里应用到了java的多态, 面向接口开发,同一个接口,使用不同的实例而执行不同操作
        Moveable m = new Car();
        m.go();
    }
}

需求二

任意订制不同交通工具的生成过程, 接下来开始简单工厂

简单工厂

新建一个SimpleVehicleFactory用来生产各种交通工具

public class SimpleVehicleFactory {

    public Car createCar() {
        return new Car();
    }

    public Plane createPlane() {
        return new Plane();
    }

    public Broom createBroom() {
        return new Broom();
    }
}

但是这种方式扩展性不够好,每次新添加交通工具时,都要在里面新加一个方法。

main 方法

public class Main {
    public static void main(String[] args) {
       SimpleVehicleFactory f = new SimpleVehicleFactory();
       Car car = f.createCar();
       car.go;
    }
}

工厂方法

和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂

新建一个汽车生产工厂

public class CarFactory {
    public Moveable create() {
        System.out.println("a car created!");
        return new Car();
    }
}

main方法

public class Main {
    public static void main(String[] args) {
        Moveable m = new CarFactory().create();
        m.go();
    }
}

此时, 完成了需求一和需求二

通过实现Moveable接口, 完成任意订制交通工具

通过扩展具体工厂, 完成任意订制不同交通工具的生成过程

抽象工厂

抽象工厂模式通过在AbstarctFactory中增加创建产品的接口,并在具体子工厂中实现新加产品的创建,当然前提是子工厂支持生产该产品。否则继承的这个接口可以什么也不干。

img

场景描述: 一老炮,边开车边吃东西边开枪

新建一个Car,Ak47,Bread,Main

public class Car{
    public void go() {
        System.out.println("Car is going ....");
    }
}
public class AK47{
    public void shoot() {
        System.out.println("tututututu....");
    }
}
public class Bread {
    public void printName() {
        System.out.println("wdm");
    }
}

public class Main {
    public static void main(String[] args) {
        //一老炮,边开车边吃东西边开枪
        Car m = new Car();
        m.go();
        AK47 ak47 = new AK47();
        ak47.shoot();
        Bread bread = new Bread();
        bread.printName();
    }
}

需求三

任意订制产品一族

例如, 交通工具不止有汽车, 还有轮船, 武器有魔法棒, 食物有蘑菇…

  1. 新建一个抽象工厂,该工厂可以生产所有产品
/**
 * 抽象工厂,可以生产各种产品
 */
public abstract class AbstractFactory {

}
  1. 新建一个Food抽象类, 可以生产所有食物
public abstract class Food {
   abstract void printName();
}

新建一个Vehicle, 可以生产所有的交通工具

public abstract class Vehicle {
    abstract void go();
}

新建一个Weapon, 可以生产所有的武器

public abstract class Weapon {
    abstract void shoot();
}
  1. 改造抽象工厂
public abstract class AbstractFactory {

    abstract Food createFood();
    abstract Vehicle createVehicle();
    abstract Weapon createWeapon();
}
  1. 让Car继承Vehicle, AK47继承Weapon, Bread继承Food
public class Car extends Vehicle{

    @Override
    public void go() {
        System.out.println("Car is going ....");
    }
}
public class AK47 extends Weapon {
    @Override
    public void shoot() {
        System.out.println("tututututu....");
    }
}

public class Bread extends Food{
    @Override
    public void printName() {
        System.out.println("wdm");
    }
}

4 新建食物 MushRoom继承Food, 新建交通工具-轮船Broom继承Vehicle, 新建魔法棒MagicStick继承Weapon类,

public class MushRoom extends Food{
    @Override
    public void printName() {
        System.out.println("dmg");
    }
}
public class Broom extends Vehicle{
    public void go() {
        System.out.println("Car go wuwuwuwuw....");
    }
}
public class MagicStick extends Weapon{
    @Override
    public void shoot() {
        System.out.println("diandian....");
    }
}
  1. 新建现代工厂生产现代产品
public class ModernFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new Bread();
    }

    @Override
    Vehicle createVehicle() {
        return new Car();
    }

    @Override
    Weapon createWeapon() {
        return new AK47();
    }
}
  1. 新建魔法工厂用来生产魔法产品
public class MagicFactory extends AbstractFactory {
    @Override
    Food createFood() {
        return new MushRoom();
    }

    @Override
    Vehicle createVehicle() {
        return new Broom();
    }

    @Override
    Weapon createWeapon() {
        return new MagicStick();
    }
}
  1. 此时main方法可以这样写
public class Main {
    public static void main(String[] args) {
//        //一老炮,边开车边吃东西边开枪
//        Car m = new Car();
//        m.go();
//        AK47 ak47 = new AK47();
//        ak47.shoot();
//        Bread bread = new Bread();
//        bread.printName();
        AbstractFactory a = new ModernFactory();
        Food food = a.createFood();
        food.printName();
        Vehicle vehicle = a.createVehicle();
        vehicle.go();
        Weapon weapon = a.createWeapon();
        weapon.shoot();
    }

输出结果

wdm
Car is going ....
tututututu....

总结

​ 上面介绍的三种工厂模式有各自的应用场景,实际应用时能解决问题满足需求即可,可灵活变通 。重点是掌握其中的设计思想,切勿为了设计而设计,以免像老太太裹脚布,又臭又长。

设计模式(一)工厂模式Factory(创建型) 设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些......... 阅读详情

相关推荐

Factory模式

NULL 博文链接:https://gary0416.iteye.com/blog/902165

Factory Pattern(工厂模式)

个人关于工厂模式的学习、理解以及实际案例的应用

我与岁月的森林的博客 821

高速SerDes均衡技术解析

均衡技术是高速SerDes链路中补偿信道损耗和失真的核心技术,通过FFE、CTLE和DFE三种主要方法对抗码间干扰(ISI)。FFE在发射端预补偿前光标干扰,CTLE通过提升高频增益补偿信道损耗,DFE则精准消除后光标干扰。三种技术各具优势:FFE实现简单且不放大噪声,CTLE功耗低易于集成,DFE能自适应调整且保持信噪比。这些技术协同工作可有效提升系统传输速率和可靠性。

一只豌豆象的博客 1945

设计模式【1】——工厂模式(Factory 模式)

在面向对象系统设计中经常可以遇到以下的两类问题:1)为了提高内聚(Cohesion)和松耦合(Coupling),我们通常会抽象出类的公共接口以形成抽象基类或者接口。基于此,我们可以通过定义一个指向基类的指针来指向实际的子类实现,达到了多态的目的。但是,当有许多的子类继承自抽象基类,我们每次要用到子类式就需要重新定义子类,诸如 new ×××的代码。这样处理会带来两个问题 :1.客户程序员必须知道实际子类的名称(当系统复杂后,命名可能就出现了问题);2.程序的扩展性和维护变得越来越困难。

sinat_42974726的博客 807

MATLAB联合Fluent优化仿真

matlab与fluent交互

keleke_的博客 4721

Aruco标签定位、测距、三维位置估算 opencv应用

摄像头要一开始对准aruco标签才开始运行。+ 相机标定文件(参考我的上篇文章)+ aruco标签6*6。

dgut_guangdian的博客 4221

设计模式第3讲——工厂模式(Factory)

工厂模式是一种创建型设计模式。一、什么是工厂模式 二、工厂分类 三、应用场景3.1 生活场景3.2 java场景 四、 工厂模式实现4.0 代码结构4.1 传统模式4.2 简单工厂模式4.3 方法工厂模式4.4 抽象工厂模式五、总结5.1 简单工厂模式5.2 方法工厂模式5.3 抽象工厂

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2865

C++ 工厂模式(Factory 模式)简介与实现

以上两个问题也就引出了 Factory 模式的两个最重要的功能: 1)定义创建对象的接口,封装了对象的创建; 2)使得具体化类的工作延迟到了子类中。

yangxueyangxue的博客 3048

数据库崩溃恢复机制:REDO日志与UNDO日志详解

在数据库管理系统中,事务的持久性和一致性是至关重要的。为了保证在系统崩溃或发生故障时数据不会丢失,数据库引入了恢复机制。其中,REDO日志和UNDO日志是两种关键的恢复技术。本文将详细描述这两种日志的作用、工作原理以及它们在数据库崩溃恢复中的应用。

My_wife_QBL的博客 1408

个人顶级AI助手OpenClaw(Clawdbot) - 新手快速入门指南

本文详细介绍了个人顶级AI助手OpenClaw(Clawdbot) 的快速入门指南,包括安装部署和使用配置及注意事项

program哲学 5302

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

一、工厂模式是什么? 二、工厂模式 案例 工厂模式的优缺点 优点 缺点 三、简单/静态工厂模式 案例 简单/静态工厂模式的优缺点 优点 缺点 四、抽象工厂模式 案例 抽象工厂模式的优缺点 优点 缺点

梦清尘的博客 1309

eCognition易康操作教程(二):多尺度分割基于多光谱数据构建规则集,结合DSM高程数据提取建筑物、树木和绿地

一、数据 数据来源:教程中的实验数据,共包含RGB三个波段,还有数字地表模型(以下简称DSM)文件。 图一 RGB影像 数据特征:数据范围较小,要素种类少,仅包含较多的建筑和大片的绿地。由于建筑的房顶使用的材料和材料颜色不同,所以建筑的光谱特征没有规律,是不连续的特征。而绿地的光谱特征则十分容易分辨。 但是建筑通常具有规则的形状,而且建筑相比于周围其他要素...

蒹葭苍苍 8302

Abstract Factory Design Pattern 抽象工厂设计模式 - 总结

Abstract Factory Design Pattern 就是一般的Factory Design Pattern的进一步设计,增加一个抽象工厂,然后利用这个工厂可以创建不同基类的类。 当我们需要创建更多不同类的时候就可以使用这个设计模式了。 这个设计模式的代码相对会多点,但是其中的思想就是一般Factory Design Pattern,然后集合更多的基类,看起来挺大的一个设计模式,其思

靖空间 1617

46、搭建与配置FTP服务器全攻略

本文详细介绍了如何搭建与配置FTP服务器,以vsftpd为例,涵盖了FTP基础概念、安装步骤、服务控制、安全设置、用户权限管理、文件上传支持、互联网共享配置、客户端使用以及常见问题解决等内容。旨在帮助用户高效、安全地实现文件共享与管理。

time3的博客 88

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

『Java』设计模式(Design pattern)之工厂模式(Factory Pattern)

# 前言 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。工厂模式属于创建型模式。工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为**简单工厂模式和工厂方法模式**,根据工厂的抽象程度可分为**工厂方法模式和抽象工厂模式**。 **工厂模式的本质就是对获取对象过程的抽象。** 工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

Ho1aAs‘s Blog 1086

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

设计模式-工厂模式上(Factory Design Pattern)

1、工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。 2、简单工厂、工厂方法原理比较简单,在实际的项目中也比较常用。而抽象工厂的原理稍微复杂点,在实际的项目中相对也不常用。 3、详细介绍: 3.1、简单工厂: 在下面这段代码中,我们根据配置文件的后缀(json、xml、yaml、properties),选择不同的解析器(JsonRuleConfigParser、XmlRuleConfigParser……),将存储在文件中的配置解析成内存对象 RuleConfig。 p...

Java开发者Peng博客 266

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式(DesignPattern)之工厂模式(Factory)

1、定义        定义一个创建对象的接口,由子类决定去实例化具体的类,工厂方法把实例化推迟到了子类中。2、关键点        在需要创建大量对象的时候可以使用工厂方法模式,遵循依赖倒置原则,依赖抽象接口,不依赖具体类,能够很好的减少客户端与目标类之间的耦合问题。3、UML类图4、代码实现1、工厂方法模式实现/** * 水果接口 */ public interface IFruit { ...

inventor1024的博客 802

设计模式之工厂模式(Factory Design Pattern)

工厂模块就是为了创建一类对象而设计的模式,工厂模式分为三种更加细分的类型:简单工厂、工厂方法和抽象工厂。 一个普通人,白手起家,在服装厂工作几年后,想自己当老板,但是又没有太多的资金。只能租个小厂房(作坊)帮别人加工产品。所有的产品不管是生产衣服、帽子、袜子还是内裤都这个小厂房里生产。 简单工厂模式,可以理解为一个作坊模式。简单工厂模式平时是用的最多最常见的。 //服装 interface Clothing { //... } //夹克 class Jacket implements Clo

xjj1314的专栏 499

【BlankFox学习笔记-设计模式】Factory工厂模式——更灵活的创建实例

Factory——更灵活的创建实例 笔记版本:2.0 作者:BlankFox(优快云主页) 归档:设计模式浅谈 写在前面: ps: 所谓 设计模式 就是前人总结的良好代码模板——想象一下:当在求职时被问到一个大概的需求时,能够清晰直接的对他说:“根据XXX设计模式的思想,可以设计如下几个角色…”——这种就好像英语等级考试的作文,恰好命中了你背的那篇模板,清晰的思路以及良好的扩展性和易于理解的结构,会让你爱上你的代码❤️ ps:Factory模式——创建方法的集合,帮助创建对象的”工具人” (能够让

代码之狐的博客 836

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

Factory模式是一种创建型设计模式,用于封装对象的实例化过程。它提供了一个统一的接口来创建不同类型的对象,而无需暴露具体的实例化逻辑给客户端。 #include <iostream> #include <memory> // AbstractProduct(抽象产品类):定义产品共同的接口 class Product { public: virtual void operation() = 0; }; // ConcreteProductA(具体产品类A) class

qq_51853681的博客 803

工厂设计模式(Factory)

工厂设计模式(Factory) 对于接口而言,已经可以明确的清楚,必须有子类,并且子类可以通过对象的向上转型来获取接口的实例化对象。但是在进行对象实例化过程之中也有可能存在有设计问题。 范例:观察如下一个程序 class JavaDemo { public static void main(String[] args) { IFood food = new Bread(); food.eat();//吃面包 } } interface IFood{ //定义一个食物的标准 public

weixin_46245201的博客 260

【设计模式】工厂模式(Factory Pattern)

工厂模式

qq_27198345的博客 1万+

C++设计模式之:工厂模式factory

it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案,使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式坚持七大原则:开闭原则,单一职责原则,里氏替换原则,依赖倒转原则,接口隔离原则,迪米特原则,合成复用原则,而各项设计模式又区分为三大模式,创建型模式,结构型模式,行为模式。

weixin_45068267的博客 2456

【设计模式】工厂模式(Factory)

尽力以通俗易懂的方式讲解简单工厂,工厂方法和抽象工厂。主要结合自身课程内容用以复习使用。

WaWaJie的博客 1124

C++设计模式笔记(09) - Abstract Factory 抽象工厂

C++设计模式笔记(08) - Factory Method工厂方法: https://blog.youkuaiyun.com/mofan6930/article/details/104605165 参考书籍: 《设计模式:可复用面向对象软件的基础》 《Head First 设计模式》 参考课程:《C++设计模式》-李建忠 1.动机(Motivation) ▷在软件系统中,经常面临着“...

Fista的笔记本 324
上一篇: 设计模式之策略模式(Strategy)
下一篇: 设计模式之责任链模式(ChainOfResponsibility)
意田天
博客等级 码龄7年 41粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

意田天

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

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

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

打赏作者

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

抵扣说明:

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

余额充值