首页 > 其他分享 >工厂模式

工厂模式

时间:2022-09-29 17:13:59浏览次数:54  
标签:披萨 模式 public new 工厂 class Pizza

一.工厂方法模式

1.简单工厂模式

基本介绍

就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

代码实例

​ 准备一个pizza抽象类,抽象准备原材料的方法,有两个实现类分别是CheesePizza和GreekPizza。

pizza类准备

//抽象Pizza类,封装了抽象的准备原材料方法
public abstract class Pizza {
    protected String name;
    //准备原材料
    public abstract void prepare();
}
------------------------------------------------------------------------------
 //GreekPizza
public class GreekPizza extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给制作Greek披萨准备材料");
    }
}
------------------------------------------------------------------------------
 //CheesePizza
public class CheesePizza  extends Pizza{
    @Override
    public void prepare() {
        System.out.println("给制作奶酪披萨准备材料");
    }
}

新建一个工厂类

public class SimpleFactory {
    public Pizza getPizza(String type){
        switch (type) {
            case "cheese":
                return new CheesePizza();
            case "greek":
                return new GreekPizza();
        }
        System.out.println("请输入正确的pizza种类");
        return null;
    }
}

结果演示:

class Test{
    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        simpleFactory.getPizza("cheese").prepare();
        simpleFactory.getPizza("greek").prepare();
        simpleFactory.getPizza("fdas");
    }
}
------------------------------------------------------------------------------
给制作奶酪披萨准备材料
给制作Greek披萨准备材料
请输入正确的pizza种类

2.多个工厂方法模式

基本介绍

​ 是对普通工厂方法模式的改进,在普通工厂方法模式中,如果传递的字符串出错,则不能正确创建对象,而多个工厂方法模式是提供多个工厂方法,分别创建对象

代码实例:

新建工厂类:

public class GetFactory {
    public Pizza getGreek() {
        return new GreekPizza();
    }
    public Pizza getCheese() {
        return new CheesePizza();
    }
}

结果演示:

class Test{
    public static void main(String[] args) {
        GetFactory getFactory = new GetFactory();
        getFactory.getCheese().prepare();
        getFactory.getGreek().prepare();
    }
}
------------------------------------------------------------------------------
给制作奶酪披萨准备材料
给制作Greek披萨准备材料

3.静态工厂方法模式

基本介绍

将上面的多个工厂方法模式里的方法置为静态的,不需要创建实例,直接调用即可。

代码实例

public class GetFactory {
    public static Pizza getGreek() {
        return new GreekPizza();
    }
    public static Pizza getCheese() {
        return new CheesePizza();
    }
}

结果演示

class Test{
    public static void main(String[] args) {
        GetFactory.getGreek().prepare();
        GetFactory.getGreek().prepare();
    }
}
------------------------------------------------------------------------------
给制作Greek披萨准备材料
给制作Greek披萨准备材料

总结

总体来说,工厂模式适合:凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。在以上的三种模式中,第一种如果传入的字符串有误,不能正确创建对象,第三种相对于第二种,不需要实例化工厂类,所以,大多数情况下,我们会选用第三种——静态工厂方法模式。

二.抽象工厂模式

基本介绍

​ 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。

代码实例:

抽象工厂

public interface AbstractFactory {
    public Pizza getPizza();
}

工厂类:

public class CheesePizzaFactory implements AbstractFactory {
    @Override
    public Pizza getPizza() {
        return  new CheesePizza();
    }
}
------------------------------------------------------------------------------
public class GreekPizzaFactory implements AbstractFactory {
    @Override
    public Pizza getPizza() {
        return  new GreekPizza();
    }
}

测试:

class Test{
    public static void main(String[] args) {
        new GreekPizzaFactory().getPizza().prepare();
        new CheesePizzaFactory().getPizza().prepare();
    }
}
------------------------------------------------------------------------------
给制作Greek披萨准备材料
给制作奶酪披萨准备材料

好处

​ 如果有需要扩充时,只需要新建一个pizza的实现类,新建其对应的工厂类,工厂类实现抽象工厂就可以完成扩充,无需在已有的代码上进行改进。扩展性好

标签:披萨,模式,public,new,工厂,class,Pizza
From: https://www.cnblogs.com/yufou/p/16742212.html

相关文章

  • 适配器模式
    适配器模式被适配目标接口packageadaptertypesourceinterface{SpecificRequest()string}被适配的目标packageadaptertypesourceImplstruct{}fu......
  • 【设计模式】29.结构型模式-装饰模式(Decorator)
    一、描述装饰模式能够在不改变原来对象结构和功能的前提下,动态的给对象增加新的功能,相比于使用子类扩展的方式,装饰模式更加的灵活。角色(1)抽象构件类:为具体构件类和装饰......
  • 大端模式和小端模式
    总是将这两个弄混了,特此记录如下:大端模式(Big-endian):高位字节排放在内存的低地址端,低位字节排放在内存的高地址端,即正序排列,高尾端;小端模式(Little-endian):低位字节排放在内......
  • 备忘录模式 Memento
    “状态变化”模式在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化"模式为这一问题提供了一种解决方案。......
  • log4net 日期和文件大小滚动Composite模式 删除自定义几天前的日志
    官方配置信息Apachelog4net–Apachelog4net:ConfigExamples-Apachelog4net官方示例实现RollingFileAppenderlogging-log4net/DerivedAppender.csat3f2b3......
  • k8s部署elk+filebeat+kafka-kraft模式集群(三)filebeat部署
    k8s集群部署filebeatfilebeat需要采集每个节点的容器日志,所以我们选择daemonset的方式#catfilebeat-rbac.yamlapiVersion:v1kind:ServiceAccountmetadata:nam......
  • k8s部署elk+filebeat+kafka-kraft模式集群(二)kafka-zk集群
    kafka-zookeeper集群部署zk使用官方镜像,版本为3.5本文跳过rbac之类配置,与前文相同#catzk-statefulset.yamlapiVersion:v1kind:Servicemetadata:name:zk-svc......
  • k8s部署elk+filebeat+kafka-kraft模式集群(一)ES集群+kibana部署
    前言:这次是在部署后很久才想起来整理了下文档,如有遗漏见谅,期间也遇到过很多坑有些目前还没头绪希望有大佬让我学习下一、环境准备k8s-master013.127.10.209k8s-ma......
  • 如何构建数字化工厂?
    首先你的明白什么事数字化工厂。数字化工厂实质上就是物理形式的工厂在数字空间的投射,并基于此来实现的以人机物(Human,Machines,Things)泛在互联为基础上,深度感知为支撑,智能决......
  • Appium PO模式UI自动化测试框架——设计与实践
      (阅读目录)  1.目的  相信做过测试的同学都听说过自动化测试,而UI自动化无论何时对测试来说都是比较吸引人的存在。相较于接口自动化来说它可以最大程度的模......