文章目录

  • 一、学习参考
  • 二、什么是工厂模式
  • 三、三大工厂
    • 1. 简单工厂
    • 2.工厂方法
    • 3.抽象工厂
  • 四、总结

一、学习参考

菜鸟教程:工厂模式
博客园:设计模式之工厂模式(factory pattern)

二、什么是工厂模式

创建者模式的一种、他提供了创建对象的一种最佳方式。工厂模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。工厂模式可分为简单工厂、工厂方法和抽象工厂模式

三、三大工厂

1. 简单工厂

简单工厂定义一个公共的父类或者接口、根据传入的参数不同创建不同实例。
需求:做一个动物简单工厂、根据传入的不同名创建对应的对象。

实现步骤:

  1. 创建一个Animal公共接口
public interface Animal {void say();
}
  1. 创建对应的子类、狗、猫、老虎
public class Dog implements Animal{@Overridepublic void say() {System.out.println("汪汪。。");}}public class Cat implements Animal{@Overridepublic void say() {System.out.println("喵喵。。");}}public class Tiger implements Animal{@Overridepublic void say() {System.out.println("嗷嗷!!!");}
}
  1. 创建一个创建动物的工厂
public class CreateAnimalFactory {public static Animal createAnimal(String type){Animal animal = null;if (type.equalsIgnoreCase("dog")){animal = new Dog();}else if (type.equalsIgnoreCase("cat")){animal = new Cat();}else if (type.equalsIgnoreCase("tiger")){animal = new Tiger();}return animal;}
}
  1. 测试
    分别创建狗、猫、虎。
public class Test01 {@Testpublic void testSimpleFactory(){Animal animal = null;String[] arr = new String[]{"dog","cat","tiger"};for (String s : arr) {animal = CreateAnimalFactory.createAnimal(s);animal.say();System.out.println(animal.getClass().getName());System.out.println("========"+s+"==============");}}}

测试结果

2.工厂方法

根简单工厂不同的是将工厂进行细分了、将具体的产品给具体的工厂。上面的动物是通过统一的AnimalFactory工厂创建的、而工厂方法就是细分创建狗的工厂给狗DogFactory,这样就不用通过指定类名创建了直接使用对应的工厂创建不同的实例。

工厂方法的实现思路是,定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

需求:做一个动物工厂方法、调用对应工厂创建对应的对象。

实现步骤:前两步和上面的简单工厂一样创建一份公共接口和对应具体实现类

  1. 创建一个Animal公共接口
public interface Animal {void say();
}
  1. 创建对应的子类、狗、猫、老虎
public class Dog implements Animal{@Overridepublic void say() {System.out.println("汪汪。。");}}public class Cat implements Animal{@Overridepublic void say() {System.out.println("喵喵。。");}}public class Tiger implements Animal{@Overridepublic void say() {System.out.println("嗷嗷!!!");}
}
  1. 创建一个工厂接口
public interface CreateAnimalFactory {Animal create();}
  1. 实现不同的工厂类
public class CreateDogFactory implements CreateAnimalFactory{@Overridepublic Animal create() {return new Dog();}
}public class CreateCatFactory implements CreateAnimalFactory{@Overridepublic Animal create() {return new Cat();}
}public class CreateTigerFactory implements CreateAnimalFactory{@Overridepublic Animal create() {return new Tiger();}
}
  1. 测试
@Testpublic void testFactoryMethod(){Animal animal = null;animal =  new CreateDogFactory().create();animal.say();System.out.println(animal.getClass().getName());animal =  new CreateCatFactory().create();animal.say();System.out.println(animal.getClass().getName());animal =  new CreateTigerFactory().create();animal.say();System.out.println(animal.getClass().getName());}

测试结果

工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。

3.抽象工厂

同工厂方法、抽象工厂是对工厂方法的优化、他和工厂方法的区别就是抽象方法是实例化一组对象。

实现方法同前两个工厂的区别就是要有多个要实例化的对象、这里以生产电子产品为例、华为和小米是工厂、然后工厂具体的产品也就是对象实例有电脑和手机。

具体实现:

  1. 创建手机和电脑实体接口和实现类
public interface PC {void openSay();
}
public interface Phone {void openSay();
}=== 华为 ===
public class HWPC implements PC{@Overridepublic void openSay() {System.out.println("欢迎使用华为电脑!!!");}
}public class HWPhone implements Phone{@Overridepublic void openSay() {System.out.println("欢迎使用华为手机!!!");}
}== 小米 ==
public class XMPC implements PC{@Overridepublic void openSay() {System.out.println("欢迎使用小米电脑!!!");}
}public class XMPhone implements Phone{@Overridepublic void openSay() {System.out.println("欢迎使用小米手机!!!");}
}
  1. 创建抽象工厂
    相比简单工厂和工厂方法是创建多个实例
public interface AbstracFactory {// 创建电脑方法PC createPC();// 创建手机方法Phone createPhone();}
  1. 通过实现创建华为工厂和小米工厂
    同样相比前两种工厂也是要实现创建两种产品的方法
===  华为 ===
public class HWFactory implements AbstracFactory{@Overridepublic PC createPC() {return new HWPC();}@Overridepublic Phone createPhone() {return new HWPhone();}
}=== 小米 ===
public class XMFactory implements AbstracFactory{@Overridepublic PC createPC() {return new XMPC();}@Overridepublic Phone createPhone() {return new XMPhone();}
}
  1. 测试
@Testpublic void testAbstractFactory(){AbstracFactory factory = null;/* 华为 */System.out.println("华为");factory = new HWFactory();PC hwpc = factory.createPC();Phone hwphone = factory.createPhone();System.out.println(hwpc.getClass().getName());hwpc.openSay();System.out.println(hwphone.getClass().getName());hwphone.openSay();/* 小米 */System.out.println("小米");factory = new XMFactory();PC xmpc = factory.createPC();Phone xmphone = factory.createPhone();System.out.println(xmpc.getClass().getName());xmpc.openSay();System.out.println(xmphone.getClass().getName());xmphone.openSay();}

测试结果

四、总结

代码gittee地址:designStudy

上面介绍的三种工厂模式有各自的应用场景,实际应用时能解决问题满足需求即可,可灵活变通,无所谓高级与低级。

此外无论哪种模式,由于可能封装了大量对象和工厂创建,新加产品需要修改已定义好的工厂相关的类,因此对于产品和工厂的扩展不太友好,利弊需要权衡一下。

创建者模式 --- 工厂模式相关推荐

  1. 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern。

    设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. 文章目录 设计模式 ~ 创建型模式 ~ 工厂模式 ~ Factory Pattern. eg. 简单工厂模式. 结构. 优 ...

  2. 如何使用 Spring 实现策略模式+工厂模式

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1.策略模式主要角色 主要角色如下: 封装角色( ...

  3. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  4. 设计模式 — 创建型模式 — 工厂模式

    目录 文章目录 目录 工厂模式(Factory Pattern) 应用场景 编码示例 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 工厂模式(Factory Pattern) 工厂模式(Fac ...

  5. 设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript

    设计模式-创建型模式-工厂模式(工厂三兄弟) TypeScript 简单工厂模式 定义一个接口,三个具体类.然后书写如下,通过选择,生产出相应的对象 // 定义Shape接口 interface Sh ...

  6. 创建型模式 工厂模式

    创建型模式 工厂模式 /*** 创建型模式 工厂模式* 工厂方法模式同样属于类的创建型模式又被称为多态工厂模式 .* 符合"开放-封闭"原则 通过添加代码的方式,不是通过修改代码的 ...

  7. 创建型模式——工厂模式

    一. 实验目的与要求 1.练习使用工厂模式.设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点. 2.实验结束后,对相关内容进行总结. 二.实验内容 1.模式应用场景说明 作为一个青年人,最好的 ...

  8. 策略模式+工厂模式(反射)+枚举代替 大量 if..else if..

    实际项目中我们经常碰到需要使用if-else-if的分支判断这种情况. 这种写法带来一些弊端. 一旦分支多太多,逻辑复杂,会导致代码十分冗长,增加阅读难度. 如果需要增加或减少分支,需要改动if-el ...

  9. 设计模式-创建型模式-工厂模式(工厂三兄弟)

    设计模式-创建型模式-工厂模式(工厂三兄弟) 工厂模式分为简单工厂,工厂方法,抽象工厂. 简单工厂模式 一个接口,三个具体类,一个工厂,通过选择,生产出对应的对象. package demo2;pub ...

  10. 体现SRP(单一职责原则)的两种模式——工厂模式和命令模式

    单一职责有两种含义:一是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责.遵循单一职责的目的: (1)可以减少类之间的耦合(模块与模块之间的依赖关系) 减少类之间的耦合,当需求发生变化时 ...

最新文章

  1. 使用 NCS2 加速推断识别图片
  2. 以GIS面对崛起的城市群
  3. 39个必知必会的SQL 性能调优方法
  4. 字节跳动第三轮技术面,Java篇
  5. SQL约束和字段约束的创建和删除
  6. 【渝粤教育】国家开放大学2018年秋季 0195-22T机械设计基础 参考试题
  7. 7.26 4 印度旅馆阿鲁沙之家
  8. 建设工程项目全寿命周期管理是指_浅谈工程项目建设全寿命周期管理
  9. linux切换声卡,Ubuntu中双声卡使用实例
  10. 论文-基于深度学习的视频中 人体动作识别技术的分析
  11. python黑白棋 pygame_python使用minimax算法实现五子棋
  12. yandex注册验证码怎么填_注册163邮箱格式怎么填?163电子邮件注册格式
  13. 宿华卸任快手CEO程一笑接替;新思科技扩大与台积公司的战略技术合作 | 全球TMT...
  14. CRM 窗体定制技巧和代码
  15. Vscode 自动保存以及保存格式
  16. 阿里云导出负载均衡SLB实例数据
  17. 模式识别(二)特征矢量与空间
  18. arduino 驱动_Arduino驱动的My Little Pony捐款箱
  19. 【遇见大咖】测试界:你的年终奖有多少?
  20. Day【10】相交链表

热门文章

  1. HTTP权威指南阅读记录 - 第一章
  2. oracle三个配置文件详叙
  3. 如何利用路由器防止DoS拒绝服务疯狂***
  4. 为什么CPU的使用率总是100%
  5. OLEDB SqlHelper
  6. 56. Attribute value 属性
  7. LoadRunner监控SQLServer
  8. TamperIE - 一个小巧的XSS漏洞检测辅助工具
  9. Mybatis中的resultType和resultMap
  10. MongoDB find方法