首页 > 其他分享 >设计模式之工厂模式

设计模式之工厂模式

时间:2023-12-22 12:04:42浏览次数:38  
标签:模式 工厂 抽象 产品 设计模式 public Pizza

工厂模式

(工厂模式) 工厂将创建对象的细节抽离出来,实现对修改关闭。

定义

==工厂方法模式==定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 工厂模式有 3 种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。

工厂方法模式中的重要原则:依赖倒置原则

如何避免违反依赖倒置原则

  • 变量不可以持有具体类的引用
  • 不要让类派生自具体类
  • 不要覆盖基类中已实现的方法

简单工厂模式

简单工厂模式将创建对象的细节进行封装,但是每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度,违背了“开闭原则”。

简单工厂模式结构如下:

  • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。
  • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。
  • 具体产品(ConcreteProduct):是简单工厂模式的创建目标。 image.png

代码实现:

  1. 抽象产品

    public interface Pizza {
        void name();
    }
    
  2. 具体产品

    public class ClamPizza implements Pizza{
        @Override
        public void name() {
            System.out.println("clam pizza");
        }
    }
    
    public class VeggiePizza implements Pizza {
        @Override
        public void name() {
            System.out.println("veggie pizza");
        }
    }
    
  3. 简单工厂

    public class PizzaFactory {
        public static Pizza getPizza(String type) {
            if ("clam".equals(type)) {
                return new ClamPizza();
            } else if ("veggie".equals(type)) {
                return new VeggiePizza();
            } else {
                return null;
            }
        }
    }
    
  4. 测试代码

    public class PizzaTestDrive {
        public static void main(String[] args) {
            Pizza clam = PizzaFactory.getPizza("clam");
            Pizza veggie = PizzaFactory.getPizza("veggie");
    
            clam.name();
            veggie.name();
        }
    }
    
  5. 结果输出

    clam pizza
    veggie pizza
    

工厂方法模式

工厂方法模式是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。

工厂方法模式结构如下:

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
  • 具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。 image.png

代码实现:

  1. 抽象产品

    public interface Pizza {
        void name();
    }
    
  2. 具体产品

    public class ClamPizza implements Pizza{
        @Override
        public void name() {
            System.out.println("clam pizza");
        }
    }
    
    public class VeggiePizza implements Pizza {
        @Override
        public void name() {
            System.out.println("veggie pizza");
        }
    }
    
  3. 抽象工厂

    public interface PizzaFactory {
        Pizza getPizza();
    }
    
  4. 具体工厂

    public class ClamFactory implements PizzaFactory {
        @Override
        public Pizza getPizza() {
            return new ClamPizza();
        }
    }
    
    public class VeggieFactory implements PizzaFactory {
        @Override
        public Pizza getPizza() {
            return new VeggiePizza();
        }
    }
    
  5. 测试代码

    public class PizzaTestDrive {
        public static void main(String[] args) {
            Pizza clam = new ClamFactory().getPizza();
            Pizza veggie = new VeggieFactory().getPizza();
    
            clam.name();
            veggie.name();
        }
    }
    
  6. 结果输出

    clam pizza
    veggie pizza
    

抽象工厂模式

抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么。这样一来,客户就从具体的产品中被解耦。

抽象工厂模式结构如下:

抽象工厂模式同工厂方法模式一样,也是由抽象工厂、具体工厂、抽象产品和具体产品等 4 个要素构成,但抽象工厂中方法个数不同,抽象产品的个数也不同。

  • 抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
  • 具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
  • 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
  • 具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。 image.png

标签:模式,工厂,抽象,产品,设计模式,public,Pizza
From: https://blog.51cto.com/u_16370137/8933925

相关文章

  • Tita丨升级看板模式
    看板模式价值:看板模式可以灵活的对任务进行分类和管理,可以根据项目的需要,来创建不同的看板,根据看板,来把任务进行清晰的分类。对于任务和看板可以进行灵活的拖拽,以此来重新设置任务或看板的位置,它比里程碑对任务的展示更加轻量~Tita-OKR和新绩效一体化管理平台该如何来玩转看......
  • 微服务广播模式实践:维护内存数据的缓存一致性
    本文分享自华为云社区《微服务广播模式实践》,作者:张俭。微服务广播模式,指的是在微服务多实例部署的场景下,将消息广播到多个微服务实例的一种模式。广播模式,一般用来维护微服务的内存数据,根据数据类型的不同,有助于解决两类问题。通常广播模式会使用支持发布订阅的消息中间件实......
  • 官宣!DevExpress Blazor UI组件,支持全新的.NET 8渲染模式
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。.NET8为Blazor引入了令人兴奋的重大变化,统一了它的托管模型,并采用了服务器......
  • 新材料行业ERP有什么用?工厂如何挑选实用的系统
    社会经济的发展不断推动信息和数字科技的进步,而社会科技的进步又不断促进企业经营模式和管理方式的变革,在当今这个数字化时代,不少新材料企业也面临如何进行信息化升级的问题。新材料种类不同,对应的产成品类别不同,日常经营涉及的订单、客户、合同、财务、采购、配送等业务......
  • 中西方全面预算模式异同点
    说说全面预算:凡事预则立,不预则费,中西方在管理思想上有很多方面是不怎么相同的欧美公司做法:无预算不执行,执行的是刚性预算谁的预算谁使用,便于后续考核分析,比如有的公司能预算到每一张打印纸,你用完了只能去找别的组织去借注重分析控制,国外的全面预算软件,比如hyperionplanning,c......
  • 抽象工厂模式
    c#中工厂模式详解 总体介绍:  工厂模式主要有三种类型:简单工厂、工厂方法和抽象工厂,该模式用于封装和管理对象的创建,是一种创建型模式。  万物皆对象,创建对象时必然需要new该对象,当需要更改对象时,需要把项目中所有地方都修改一遍,这显然违背了软件设计的开闭原则。  ......
  • 抖音直播卖货爆品模式细节
    爆品1付费2素材(视频)3时长战略亏损前1-2场亏损开流量3-4场持平长期赚钱1.不上别人卖的好的就是你也可以卖的好的2.做自己感兴趣的行业长期做深耕沉淀3抖音推流分钟制  这波流量的获取取决于上一分钟的数据 关注互动灯牌停留等不要盲目的拉时长 务必播......
  • Canvas三种模式
    1.ScreenSpace-OverlayCanvas永远撑满屏幕并显示在最上层,不绑定Camera(有没有Camera都能显示)。适合用来做最上层的UI。导航栏、分辨率自适应两边的框等。2.ScreenSpace-CameraCanvas自动填充指定摄像机的屏幕,但其他游戏对象(模型等)可以在它之前显示,根据和指定摄像机距离调整是......
  • 观察者模式和发布订阅模式的区别
    观察者模式只有两个对象,一个是观察者(Listener)和被观察者;观察者通过实现被被观察者提供的接口,add到被观察者的Listener列表里;当被观察者内部产生相关事件时,通过其Listener列表来通知观察者; 而发布定义模式则多了一个中介(比如Kafka),即分为了生产者、中介、消费者三个角色了;生产......
  • windows进入安全模式
    administrator权限不足时,可以到安全模式下有system权限管理员唤起cmd启用administrator用户netuseradministrator/active:yes设置/修改密码netuseradministratornew_password 输入msconfig常规--有选择启动--只保留使用原始引导配置 引导--安全引导--最小 ......