• 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂

image.png

简单工厂模式(Simple Factory)

image.png

三个角色

  • Factory:工厂角色,
  • WuLinFactory Product:抽象产品角色,
  • Car ConcreteProduct:具体产品角色, VanCar、MiniCar

缺点:违背开闭原则,每次新增产品都需要修改代码逻辑

代码实现

  1. //抽象产品角色
  2. public abstract class Car {
  3. abstract void run();
  4. }
  1. //产品具体的实现
  2. @Data
  3. public class MiniCar extends Car{
  4. private String name;
  5. private String age;
  6. @Override
  7. void run() {
  8. System.out.println("MiniCar");
  9. }
  10. }
  1. //产品的具体实现
  2. @Data
  3. public class VanCar extends Car{
  4. private String name;
  5. private String age;
  6. @Override
  7. void run() {
  8. System.out.println("VanCar");
  9. }
  10. }
  1. //工厂角色
  2. public class WuLinFactory {
  3. public static Car newCar(String car) {
  4. if ("MiniCar".equals(car)) {
  5. return new MiniCar();
  6. }
  7. if ("VanCar".equals(car)) {
  8. return new VanCar();
  9. }
  10. return null;
  11. }
  12. }
  1. //测试类
  2. public class CarTest {
  3. public static void main(String[] args) {
  4. Car miniCar = WuLinFactory.newCar("MiniCar");
  5. Car vanCar = WuLinFactory.newCar("VanCar");
  6. miniCar.run();
  7. vanCar.run();
  8. }
  9. }

工厂(Factory)模式-工厂方法(Factory Method)

image.png

四个角色

  • Product:抽象产品
  • ConcreteProduct:具体产品
  • Factory:抽象工厂
  • ConcreteFactory:具体工厂

缺点:系统复杂度增加,产品单一

代码实现

  1. //抽象产品角色
  2. public abstract class Car {
  3. abstract void run();
  4. }
  1. //产品具体的实现
  2. @Data
  3. public class MiniCar extends Car{
  4. private String name;
  5. private String age;
  6. @Override
  7. void run() {
  8. System.out.println("MiniCar");
  9. }
  10. }
  1. //产品的具体实现
  2. @Data
  3. public class VanCar extends Car{
  4. private String name;
  5. private String age;
  6. @Override
  7. void run() {
  8. System.out.println("VanCar");
  9. }
  10. }
  1. //工厂具体实现
  2. public class WulinMiniFactory extends WulinFactory{
  3. @Override
  4. public Car newCar() {
  5. return new MiniCar();
  6. }
  7. }
  1. //工厂具体实现
  2. public class WulinVanFactory extends WulinFactory{
  3. @Override
  4. public Car newCar() {
  5. return new VanCar();
  6. }
  7. }
  1. //抽象工厂
  2. public abstract class WulinFactory {
  3. public abstract Car newCar();
  4. }
  1. //测试
  2. public class CarTest {
  3. public static void main(String[] args) {
  4. WulinFactory wulinVanFactory = new WulinVanFactory();
  5. WulinFactory wulinMiniFactory = new WulinMiniFactory();
  6. Car car = wulinVanFactory.newCar();
  7. Car car1 = wulinMiniFactory.newCar();
  8. car.run();
  9. car1.run();
  10. }
  11. }

工厂(Factory)模式-抽象工厂(Abstract Factory)

image.png
与工厂方法模式的区别,顶级工厂抽象有所有创建工厂方法,子工厂按需实现
如何实现,人民需要什么,五菱就造什么

代码实现

  1. //Car 顶层抽象
  2. public abstract class Car {
  3. public abstract void run();
  4. }
  1. //N 顶层抽象
  2. public abstract class N {
  3. public abstract void run();
  4. }
  1. @Data
  2. public class MiniCar extends Car{
  3. private String name;
  4. private String age;
  5. @Override
  6. void run() {
  7. System.out.println("MiniCar");
  8. }
  9. }
  1. @Data
  2. public class VanCar extends Car{
  3. private String name;
  4. private String age;
  5. @Override
  6. void run() {
  7. System.out.println("VanCar");
  8. }
  9. }
  1. public class N95 extends N{
  2. @Override
  3. public void run() {
  4. System.out.println("N95");
  5. }
  6. }
  1. public class N99 extends N{
  2. @Override
  3. public void run() {
  4. System.out.println("N99");
  5. }
  6. }
  1. /**
  2. * 定义总厂规范
  3. *
  4. */
  5. public abstract class WulinFactory {
  6. public abstract Car newCar();
  7. public abstract N newN();
  8. }
  1. public class WulinMiniFactory extends WulinFactory{
  2. @Override
  3. public Car newCar() {
  4. return new MiniCar();
  5. }
  6. @Override
  7. public N newN() {
  8. return null;
  9. }
  10. }
  1. public class WulinVanFactory extends WulinFactory{
  2. @Override
  3. public Car newCar() {
  4. return new VanCar();
  5. }
  6. @Override
  7. public N newN() {
  8. return null;
  9. }
  10. }
  1. public class WulinN95Factory extends WulinFactory{
  2. @Override
  3. public Car newCar() {
  4. return null;
  5. }
  6. @Override
  7. public N newN() {
  8. return new N95();
  9. }
  10. }
  1. public class WulinN99Factory extends WulinFactory{
  2. @Override
  3. public Car newCar() {
  4. return null;
  5. }
  6. @Override
  7. public N newN() {
  8. return new N99();
  9. }
  10. }

工厂模式的退化

当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。

什么场景用到?

  • NumberFormat、SimpleDateFormat
  • LoggerFactory:
  • SqlSessionFactory:MyBatis
  • BeanFactory:Spring的BeanFactory(就是为了造出bean)
  • ……