工厂模式 Factory

工厂模式

工厂模式分为两种,工厂方法抽象工厂

  • 工厂方法用于定制任意的产品,而抽象工厂用于定制任意的产品族

什么是工厂?

  • 凡是能够生成对象的方法或类,都可以称作工厂

什么是工厂方法?
工厂方法UML图
不同的对象通过不同的工厂来创建,可以指定各个对象的具体创建过程,如在创建对象前需要做什么,创建之后需要做什么,最终返回对象

  1. Car的工厂方法
//Car
public class Car implements Moveable {
   @Override
   public void go() {
      System.out.println("car wowowo ...");
   }
}

//接口
public interface Moveable {
   void go();
}

//Car工厂
public class CarFactory {
   public Moveable create() {
      System.out.println("a car created !");
      return new Car();
   }
}
  1. Train的工厂方法
public class Train implements Moveable {
   @Override
   public void go() {
      System.out.println("train wuwuwu ...");
   }
}

public class TrainFactory {
   public Moveable create() {
      System.out.println("a train created !");
      return new Train();
   }
}
  1. 总之,工厂方法就是需要什么类,就构建对应类的工厂
xxxFactory.create();

什么是抽象工厂?
抽象工厂需要定义一个顶层的抽象工厂类,包含返回系列产品族的抽象方法,具体的工厂需要继承此抽象工厂,用于生产各种对象,同时,不同工厂生产的产品都属于同一产品族

抽象工厂UML

  1. 定义各种产品的抽象类
public abstract class Food {
   abstract void printName();
}

public abstract class Weapon {
   abstract void attack();
}

public abstract class Vehicle {
   abstract void go();
}
  1. 抽象的工厂,定义了生产产品的方式
/**
 * 定制任意产品族
 */
public abstract class AbstractFactory {
   abstract Vehicle createVehicle();
   abstract Food createFood();
   abstract Weapon createWeapon();
}
  1. 假设在现代社会中,人们开着车、嚼着面包,并且手里拿着M416准备奥里给的时候,那么我们的现代工厂如下所示
/**
 * 现代产品族工厂
 * 现代人开车、吃面包、用M416
 */
public class ModernFactory extends AbstractFactory {
   @Override
   Vehicle createVehicle() {
      return new Car();
   }

   @Override
   Food createFood() {
      return new Bread();
   }

   @Override
   Weapon createWeapon() {
      return new M416();
   }
}
  1. 如果在魔法世界,人们骑着扫帚,吃着蘑菇,然后用魔法棒来发动奥里给的时候,魔法工厂如下所示:
public class MagicFactory extends AbstractFactory {
   @Override
   Vehicle createVehicle() {
      return new Broom();
   }

   @Override
   Food createFood() {
      return new MushRoom();
   }

   @Override
   Weapon createWeapon() {
      return new MagicStick();
   }
}
  1. 接下来看看实例,现代人的生活方式如下
public class Main {
   public static void main(String[] args) {
      //现代人产品族
      AbstractFactory factory = new ModernFactory();
      Vehicle vehicle = factory.createVehicle();
      Food food = factory.createFood();
      Weapon weapon = factory.createWeapon();
      vehicle.go();
      food.printName();
      weapon.attack();
   }
}
  1. 如果在魔法世界,只需将factory指向MagicFactory对象的地址即可
public static void main(String[] args) {
      //魔法人产品族
      AbstractFactory factory = new MagicFactory();
      Vehicle vehicle = factory.createVehicle();
      Food food = factory.createFood();
      Weapon weapon = factory.createWeapon();
      vehicle.go();
      food.printName();
      weapon.attack();
   }
  1. 封装对象时,什么时候使用抽象类,什么时候接口?
  • 抽象类一般用于现实中存在的事物,但是不是某种具体的事物时,比如:食物、交通工具
  • 接口一般用于抽象出事物通用的某种属性。比如:可移动的、圆形的
  • 一般来说,抽象类描述名词,接口描述形容词
发布了18 篇原创文章 · 获赞 6 · 访问量 6626

猜你喜欢

转载自blog.csdn.net/HuangGang_clown/article/details/104271823