图解工厂模式

什么是工厂设计模式?

工厂设计模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则,如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦

抽象工厂的实现

​抽象工厂可以用来生产一组相同,有相对关系的产品;重点在于一组,一批,一系列;举个例子,假如生产小米手机,小米手机有很多系列,小米note、红米note等;假如小米note生产需要的配件有825的处理器,6英寸屏
幕,而红米只需要650的处理器和5寸的屏幕就可以了;用抽象工厂来实现:

抽象工厂的uml
在这里插入图片描述

cpu手机组件

/**
 * cpu型号接口
 */
public interface Cpu {
    void run();
}

public class Cpu650 implements Cpu{
    @Override
    public void run() {
        System.out.println("650cpu");
    }
}
public class Cpu865 implements Cpu{
    @Override
    public void run() {
        System.out.println("650cpu");
    }
}

手机屏幕尺寸组件

/**
 * 屏幕尺寸
 */
public interface Screen {
    void size();
}
public class Screen5 implements Screen{
    @Override
    public void size() {
        System.out.println("5寸的屏幕");
    }
}
public class Screen6 implements Screen{
    @Override
    public void size() {
        System.out.println("6寸的屏幕");
    }
}

生产手机抽象工厂

/**
 * 手机抽象工厂
 */
public interface PhoneFactory {
    Cpu getCpu();
    Screen getScreen();
}

生产手机的具体工厂

/**
 * 红米手机工厂
 */
public class HongMiFactory implements PhoneFactory{
    @Override
    public Cpu getCpu() {
        return new Cpu650();
    }

    @Override
    public Screen getScreen() {
        return new Screen5();
    }
}
/**
 * 小米手机的工厂
 */
public class XiaoMiFactory implements PhoneFactory{

    @Override
    public Cpu getCpu() {
        return new Cpu865();
    }

    @Override
    public Screen getScreen() {
        return new Screen6();
    }
}

生产手机测试

/**
 * 生产手机
 */
public class ProductPhone {
    public static void main(String[] args) {
        HongMiFactory hongMiFactory = new HongMiFactory();
        Cpu cpu = hongMiFactory.getCpu();
        Screen screen = hongMiFactory.getScreen();
        cpu.run();
        screen.size();
    }
}

结果

/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home/bin/java -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar=51074:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encoding=UTF-8 -classpath /Users/tao/IdeaProjects/stadu_all/pattern/target/classes:/Users/tao/maven/repository/org/apache/camel/camel-core/3.13.0/camel-core-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-core-engine/3.13.0/camel-core-engine-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-base-engine/3.13.0/camel-base-engine-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-core-reifier/3.13.0/camel-core-reifier-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-core-processor/3.13.0/camel-core-processor-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-core-languages/3.13.0/camel-core-languages-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-core-model/3.13.0/camel-core-model-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-bean/3.13.0/camel-bean-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-browse/3.13.0/camel-browse-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-cluster/3.13.0/camel-cluster-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-controlbus/3.13.0/camel-controlbus-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-dataformat/3.13.0/camel-dataformat-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-dataset/3.13.0/camel-dataset-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-direct/3.13.0/camel-direct-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-directvm/3.13.0/camel-directvm-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-file/3.13.0/camel-file-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-health/3.13.0/camel-health-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-language/3.13.0/camel-language-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-log/3.13.0/camel-log-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-mock/3.13.0/camel-mock-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-ref/3.13.0/camel-ref-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-rest/3.13.0/camel-rest-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-tooling-model/3.13.0/camel-tooling-model-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-util-json/3.13.0/camel-util-json-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-saga/3.13.0/camel-saga-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-scheduler/3.13.0/camel-scheduler-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-seda/3.13.0/camel-seda-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-stub/3.13.0/camel-stub-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-timer/3.13.0/camel-timer-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-validator/3.13.0/camel-validator-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-vm/3.13.0/camel-vm-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-xpath/3.13.0/camel-xpath-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-xslt/3.13.0/camel-xslt-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-xml-jaxb/3.13.0/camel-xml-jaxb-3.13.0.jar:/Users/tao/maven/repository/jakarta/xml/bind/jakarta.xml.bind-api/2.3.3/jakarta.xml.bind-api-2.3.3.jar:/Users/tao/maven/repository/jakarta/activation/jakarta.activation-api/1.2.2/jakarta.activation-api-1.2.2.jar:/Users/tao/maven/repository/com/sun/xml/bind/jaxb-core/2.3.0/jaxb-core-2.3.0.jar:/Users/tao/maven/repository/com/sun/xml/bind/jaxb-impl/2.3.3/jaxb-impl-2.3.3.jar:/Users/tao/maven/repository/com/sun/activation/jakarta.activation/1.2.2/jakarta.activation-1.2.2.jar:/Users/tao/maven/repository/org/apache/camel/camel-xml-jaxp/3.13.0/camel-xml-jaxp-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-xml-io-util/3.13.0/camel-xml-io-util-3.13.0.jar:/Users/tao/maven/repository/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar:/Users/tao/maven/repository/org/apache/camel/camel-main/3.13.0/camel-main-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-api/3.13.0/camel-api-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-base/3.13.0/camel-base-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-management-api/3.13.0/camel-management-api-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-support/3.13.0/camel-support-3.13.0.jar:/Users/tao/maven/repository/org/apache/camel/camel-util/3.13.0/camel-util-3.13.0.jar:/Users/tao/maven/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.13.3/log4j-slf4j-impl-2.13.3.jar:/Users/tao/maven/repository/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar:/Users/tao/maven/repository/org/apache/logging/log4j/log4j-core/2.13.3/log4j-core-2.13.3.jar com.example.factory.abstrcactfactory.ProductPhone
650cpu
5寸的屏幕

Process finished with exit code 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧课程内容和目标本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式、原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单线程bug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值