简单工厂模式

一个抽象接口,多个抽象接口实现类,一个工厂类,用来实例化抽象接口

  1. public interface Car {
  2. public void run();
  3. public void stop();
  4. }
  5. // 具体实现类
  6. public class Benz implements Cars {
  7. public void run() {
  8. System.out.println("Benz开始启动了。。。。。");
  9. }
  10. public void stop() {
  11. System.out.println("Benz停车了。。。。。");
  12. }
  13. }
  14. public class Ford implements Cars {
  15. public void run() {
  16. System.out.println("Ford开始启动了。。。");
  17. }
  18. public void stop() {
  19. System.out.println("Ford停车了。。。。");
  20. }
  21. }
  22. // 工厂类
  23. public class Factory {
  24. public static Car getCarInstance(String type) {
  25. Car car = null;
  26. if("Benz".equals(type)) {
  27. car = new Benz();
  28. }
  29. if("Ford".equals(type)) {
  30. car = new Ford();
  31. }
  32. return car;
  33. }
  34. }
  35. public class Test {
  36. public static void main(String[] args) {
  37. Car car = Factory.getCarInstance("Benz");
  38. if(car != null) {
  39. car.run();
  40. car.stop();
  41. } else {
  42. System.out.println("造不了这种汽车。。。");
  43. }
  44. }
  45. }

工厂方法模式

有四个角色,抽象工厂模式,具体工厂模式,抽象产品模式,具体产品模式。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品。
一个工厂只生产单一的产品。

  1. // 抽象产品角色
  2. public interface Moveable {
  3. void run();
  4. }
  5. // 具体产品角色
  6. public class Plane implements Moveable {
  7. @Override
  8. public void run() {
  9. System.out.println("plane....");
  10. }
  11. }
  12. public class Broom implements Moveable {
  13. @Override
  14. public void run() {
  15. System.out.println("broom.....");
  16. }
  17. }
  18. // 抽象工厂
  19. public abstract class VehicleFactory {
  20. abstract Moveable create();
  21. }
  22. // 具体工厂
  23. public class PlaneFactory extends VehicleFactory {
  24. public Moveable create() {
  25. return new Plane();
  26. }
  27. }
  28. public class BroomFactory extends VehicleFactory {
  29. public Moveable create() {
  30. return new Broom();
  31. }
  32. }
  33. public class Test {
  34. public static void main(String[] args) {
  35. VehicleFactory factory = new BroomFactory();
  36. Moveable m = factory.create();
  37. m.run();
  38. }
  39. }

抽象工厂模式

与工厂方法模式不同,抽象工厂模式中的工厂生产多个产品。

  1. //抽象工厂类
  2. public abstract class AbstractFactory {
  3. public abstract Vehicle createVehicle();
  4. public abstract Weapon createWeapon();
  5. public abstract Food createFood();
  6. }
  7. //具体工厂类,其中Food,Vehicle,Weapon是抽象类,
  8. public class DefaultFactory extends AbstractFactory{
  9. @Override
  10. public Food createFood() {
  11. return new Apple();
  12. }
  13. @Override
  14. public Vehicle createVehicle() {
  15. return new Car();
  16. }
  17. @Override
  18. public Weapon createWeapon() {
  19. return new AK47();
  20. }
  21. }
  22. //测试类
  23. public class Test {
  24. public static void main(String[] args) {
  25. AbstractFactory f = new DefaultFactory();
  26. Vehicle v = f.createVehicle();
  27. v.run();
  28. Weapon w = f.createWeapon();
  29. w.shoot();
  30. Food a = f.createFood();
  31. a.printName();
  32. }

三种工厂模式的特点

  • 简单工厂模式:每次扩展时,需要新增一个类,并修改工厂内部代码,添加新的if分支。
  • 工厂方法模式:与简单工厂的区别就在于有多个工厂,每个工厂只专注生产一种产品,当需要修改获取的产品时,著需要修改所访问的工厂就行。
  • 抽象工厂模式:每次扩展时,只需要添加一个类,并添加一个对应工厂。扩展灵活,不需要修改旧的类,但是需要编写新的工厂类。