1. 简单工厂
  2. 静态工厂(简单工厂中方法是静态时的特例)
  3. 工厂方法
  4. 抽象工厂
  5. Spring IOC
  6. 任何可以产生对象的方法或类都可以称之为工厂
  7. 单例也是一种工厂(静态工厂)
  8. 出现原因
    • 灵活控制生产过程
    • 权限、修饰(装饰模式)、日志……

简单工厂

  • 也叫静态方法模式(因为工厂类定义了一个静态方法)
  • 一个工厂产生多种类型的对象
    • 可以一种类型一种方法
    • 也可以一个方法多种类型

      UML类图

      image.png

接口及实体类说明

Movable接口

  1. package com.mashibing.dp.factorymethod;
  2. public interface Moveable {
  3. void go();
  4. }

Car类
  1. package com.mashibing.dp.factorymethod;
  2. public class Car implements Moveable {
  3. public void go() {
  4. System.out.println("Car go wuwuwuwuw....");
  5. }
  6. }

Broom类
  1. package com.mashibing.dp.factorymethod;
  2. public class Broom implements Moveable{
  3. @Override
  4. public void go() {
  5. System.out.println("broom flying chuachuachua .....");
  6. }
  7. }

简单工厂

  1. package com.mashibing.dp.factorymethod;
  2. /**
  3. * 简单工厂的可扩展性不好
  4. */
  5. public class SimpleVehicleFactory {
  6. public Car createCar() {
  7. //before processing
  8. return new Car();
  9. }
  10. public Broom createBroom() {
  11. return new Broom();
  12. }
  13. // 也可以用一个方法通过传入参数的不同来决定返回的对象
  14. }

静态工厂(即简单工厂--->单例模式)

  • 这种工厂就是简单工厂
  • 生成对象的方法是静态时称为静态工厂模式

工厂方法(是抽象工厂的特例)

  • 针对每一种类型创建一个工厂类

    UML类图

    image.png

工厂方法CarFactory

  1. package com.mashibing.dp.factorymethod;
  2. public class CarFactory {
  3. public Moveable create() {
  4. System.out.println("a car created!");
  5. return new Car();
  6. }
  7. }
  8. // Broom类的工厂方法类似

抽象工厂

  • 产品族的概念—->族系
  • 能够灵活地拓展产品族的方式

    UML类图

    image.png

    下面这张类图是错的,主要是工厂指向产品的箭头画错了 更正:**Factory A应该指向Concrete ProductA1和Concrete ProductB1 Factory B应该指向Concrete ProductA2和Concrete ProductB2**
    image.png

抽象类及实体类

Food抽象类

  1. package com.mashibing.dp.abstractfactory;
  2. public abstract class Food {
  3. abstract void printName();
  4. }

Bread类
  1. package com.mashibing.dp.abstractfactory;
  2. public class Bread extends Food{
  3. public void printName() {
  4. System.out.println("wdm");
  5. }
  6. }

MashRoom类
  1. package com.mashibing.dp.abstractfactory;
  2. public class MushRoom extends Food{
  3. public void printName() {
  4. System.out.println("dmg");
  5. }
  6. }

Weapon抽象类

  1. package com.mashibing.dp.abstractfactory;
  2. public abstract class Weapon {
  3. abstract void shoot();
  4. }

AK47类
  1. package com.mashibing.dp.abstractfactory;
  2. public class AK47 extends Weapon{
  3. public void shoot() {
  4. System.out.println("tututututu....");
  5. }
  6. }


MagicStick类
  1. package com.mashibing.dp.abstractfactory;
  2. public class MagicStick extends Weapon{
  3. public void shoot() {
  4. System.out.println("diandian....");
  5. }
  6. }

抽象工厂AbstractFactory

  1. package com.mashibing.dp.abstractfactory;
  2. public abstract class AbstractFactory {
  3. abstract Food createFood();
  4. // abstract Vehicle createVehicle();
  5. abstract Weapon createWeapon();
  6. }

ModernFactory类

  1. package com.mashibing.dp.abstractfactory;
  2. public class ModernFactory extends AbastractFactory {
  3. @Override
  4. Food createFood() {
  5. return new Bread();
  6. }
  7. // @Override
  8. // Vehicle createVehicle() {
  9. // return new Car();
  10. // }
  11. @Override
  12. Weapon createWeapon() {
  13. return new AK47();
  14. }
  15. }

MagicFactory类

  1. package com.mashibing.dp.abstractfactory;
  2. public class MagicFactory extends AbastractFactory {
  3. @Override
  4. Food createFood() {
  5. return new MushRoom();
  6. }
  7. // @Override
  8. // Vehicle createVehicle() {
  9. // return new Broom();
  10. // }
  11. @Override
  12. Weapon createWeapon() {
  13. return new MagicStick();
  14. }
  15. }

工厂的使用

  1. package com.mashibing.dp.abstractfactory;
  2. public class Main {
  3. public static void main(String[] args) {
  4. AbastractFactory f = new ModernFactory();
  5. // Vehicle c = f.createVehicle();
  6. // c.go();
  7. Weapon w = f.createWeapon();
  8. w.shoot();
  9. Food b = f.createFood();
  10. b.printName();
  11. }
  12. }

存在问题(工厂模式探讨)

  • 什么时候用接口,什么时候用抽象类
  • 在设计时有时用接口和抽象类都可以,但是要注意语义问题
    • 抽象类是实实在在存在的事物,只不过相对抽象一点并没有那么具体,但仍是实实在在存在的事物
    • 形容词用接口,名词用抽象类(Moveable接口和Vehicle是抽象类)
    • 实现接口是has-a的关系,继承抽象类是is-a的关系
  • 也可以有工厂的工厂—->灵活的设计方式,在实际中怎么合适怎么来设计(手中无剑,心中有剑,越来越锋利)
  • ⭐工厂方法模式适合产品上的扩展(加产品+加工厂),而抽象工厂模式在产品族内部种类的维度上拓展比较容易,但在产品族种类的维度上不好拓展(得在工厂中加一堆的方法)——>解决方案:spring的bean工厂

🤏随想

  1. maven不能本控制工具(idea中addFramework加一下maven)
  2. maven怎么解决依赖冲突的(就近原则)
  3. 两个包分别要依赖一个库,但是依赖的版本不一样就会出现问题,maven会帮你管理这种依赖版本冲突的问题(向下兼容、就近原则?)