工厂模式-(简单工厂模式)

2023-09-14 10:09:04

 首先看一下设计模式的六大原则

设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)

为什么叫最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承。

工厂模式用于实例化对象,使用工厂方法代替new操作的一种形式

下面创建一个简单工厂模式,来了解工厂模式.通过简单工厂模式创建一个工厂,工厂内部帮我们创建不同品牌的鞋

简单工厂模式示例结构:

定义一个鞋子的抽象类

public abstract class Shoe {
    protected String name="无品牌鞋";
    //鞋子展示
    abstract void Show();
}

下面实现三个品牌的鞋子

public class AnTaShoe extends Shoe{
    private String name="安踏";
    @Override
    public void Show() {
        System.out.println("这是一双"+name);
    }
}


public class NiKeShoe extends Shoe{
    private String name="耐克";
    @Override
    public void Show() {
        System.out.println("这是一双"+name);
    }
}


public class AdidasShoe extends Shoe{
    private String name="阿迪达斯";
    @Override
    public void Show() {
        System.out.println("这是一双"+name);
    }
}

定义一个鞋子工厂,由鞋子工厂判断我们需要的鞋子品牌并返回给我们

//鞋子工厂
public class ShoeFactory {
    public Shoe CreateShoe(Object obj) {
        //根据传入的鞋的类型返回对应的鞋
        if (obj instanceof AnTaShoe){
            return new AnTaShoe();
        }else if(obj instanceof NiKeShoe){
            return new NiKeShoe();
        }else if(obj instanceof AdidasShoe){
            return new AdidasShoe();
        }

        //类型都不是返回null
        return null;
    }
}

上面准备完成后,在主方法中模仿用户调用

public class User {
    public static void main(String[] args) {

        //new一个工厂对象
        ShoeFactory shoeFactory = new ShoeFactory();

        //使用工厂对象,并告诉工厂我们需要的鞋,工厂会给我们返回一个鞋,不再需要我们自己去new
        Shoe shoe1 = shoeFactory.CreateShoe(new AnTaShoe());
        shoe1.Show();
        Shoe shoe2 = shoeFactory.CreateShoe(new NiKeShoe());
        shoe2.Show();
        Shoe shoe3 = shoeFactory.CreateShoe(new AdidasShoe());
        shoe3.Show();

    }
}

输出结果:

这是一双安踏
这是一双耐克
这是一双阿迪达斯

简单工厂模式实现了创建对象由工厂返回,但是在需要新增其他品牌的鞋子时需要去修改工厂类,这样写的工厂拓展性差,违反了设计模式的开闭原则.

更多推荐

腾讯mini项目-【指标监控服务重构】2023-07-17

今日已办根据导师的指导意见修改了otelclient相关配置的代码认真学习uptrace的文档,会比otel、signoz的好理解:什么是OpenTelemetryhttps://uptrace.dev/opentelemetry/architecture.html#opentelemetry-sdktrace部分介绍

软件设计模式系列之五——建造者模式

1模式的定义建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象,而不必关心每个对象的内部细节。这种模式适用于构建具有复杂配置的对象,例如具有多个可选组件的汽车。2结构建造者模式的结构包括以下几个关键部分:Director(指导者):负责指导构

设计模式:建造者模式

目录代码简单实现常用使用方法注解方法使用建造者模式总结建造者模式(BuilderPattern)是一种创建型设计模式,它通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式将对象的构建过程封装在一个独立的建造者类中,客户端通过指定不同的建造者来构建不同的对象。在建造者模式中,有以下几个主要

http1和http2的主要区别

主要有四个方面:二进制分帧多路复用服务器主动推送头部压缩将前两点结合来说,首先二进制分帧帧:HTTP/2数据通信的最小单位;消息:HTTP/2中,例如在请求和响应等操作中,消息由一个或多个帧组成;流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。而二进制分帧是发生在应用层和传输层中间产生

第P5周—运动鞋识别

一、前期工作1.导入数据集数据集:工作台-Heywhale.comimporttorchimportmatplotlib.pyplotaspltfromtorchvisionimporttransforms,datasetsimportos,PIL,random,pathlibdata_dir=r'D:\P5-data

WebGL 计算平行光、环境光下的漫反射光颜色

目录光照原理光源类型平行光点光源环境光反射类型漫反射漫反射光颜色计算公式环境反射环境反射光颜色表面的反射光颜色(漫反射和环境反射同时存在时)计算公式平行光下的漫反射根据光线和法线方向计算入射角θ(以便求两者点积:cosθ)归一化法线:表面的朝向一个表面具有两个法向量平面的法向量唯一示例代码——平行光漫反射(Lighte

人工智能在现代科技中的应用和未来发展趋势

人工智能是一种模拟人类智能的技术,包括学习、推理、计算和自动化等方面的能力。在现代科技中,人工智能应用非常广泛,包括以下方面:1.自然语言处理:人工智能可以识别和处理自然语言,使得语音识别、语音合成、文本翻译等变得更加智能。2.图像识别:人工智能可以通过图像识别技术来分析和识别图像中的内容,使得人脸识别、车牌识别、图像

2023 蓝帽杯初赛web&部分取证复现

前言:初赛进线下了,计划着在决赛前突击学习一下取证,但时间还是太紧只看了很多内存取证和手机取证计算机取证和服务器取证没掌握---(不过复赛没考,也算狗运了)目录<1>web-LovePHP(file()函数侧信道攻击)<2>取证(1)APK取证1【APK取证】涉案apk的包名是?[答题格式:com.baid.ccs]2

华为云云耀云服务器L实例评测|redis漏洞回顾 & MySQL数据安全解决 搭建主从集群MySQL & 相关设置

前言最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,数据丢失,还好我有几份备份,没有造成太大的损失;后来有发现Redis数据库被攻击的情况,加入了redis密码初步解决问题。总之就是各种遭受毒打。。。本篇博客回顾Redis的未授权访问漏洞,介绍MySQL主从集群的搭建,以及相关

短视频搭建矩阵源码--短视频矩阵源码搭建

短视频矩阵系统是一种通过将短视频内容进行分类、管理和展示的系统。它可以将用户上传或者选择的短视频按照不同的特定标签进行分类和管理,用户可以根据自己的兴趣和需求选择观看不同类别的短视频。短视频矩阵源码的开发部署其实并不难,主要依托于抖音平台各种开放权限进行研发,市面上常见的源码功能构建也是大同小异,主要处理还在于细节及产

Delphi - Record记录和变体记录

//Integer类型刚好是4个字节,ShortInt类型是1个字节,但是Windows中内存是4字节分配,//所以这里其实还是4个字节,用SizeOf可以看到这个record的大小是8字节,这样虽然浪//费了空间,但是加快了速度(Windows内存分配中的边界对齐原理)TPerson=recordAge:Intege

热文推荐