- 简单工厂
- 静态工厂(简单工厂中方法是静态时的特例)
- 工厂方法
- 抽象工厂
- Spring IOC
- 任何可以产生对象的方法或类都可以称之为工厂
- 单例也是一种工厂(静态工厂)
- 出现原因
- 灵活控制生产过程
- 权限、修饰(装饰模式)、日志……
简单工厂
接口及实体类说明
Movable接口
package com.mashibing.dp.factorymethod;public interface Moveable {void go();}
Car类
package com.mashibing.dp.factorymethod;public class Car implements Moveable {public void go() {System.out.println("Car go wuwuwuwuw....");}}
Broom类
package com.mashibing.dp.factorymethod;public class Broom implements Moveable{@Overridepublic void go() {System.out.println("broom flying chuachuachua .....");}}
简单工厂
package com.mashibing.dp.factorymethod;/*** 简单工厂的可扩展性不好*/public class SimpleVehicleFactory {public Car createCar() {//before processingreturn new Car();}public Broom createBroom() {return new Broom();}// 也可以用一个方法通过传入参数的不同来决定返回的对象}
静态工厂(即简单工厂--->单例模式)
- 这种工厂就是简单工厂
- 生成对象的方法是静态时称为静态工厂模式
工厂方法(是抽象工厂的特例)
工厂方法CarFactory
package com.mashibing.dp.factorymethod;public class CarFactory {public Moveable create() {System.out.println("a car created!");return new Car();}}// Broom类的工厂方法类似
抽象工厂
- 产品族的概念—->族系
- 能够灵活地拓展产品族的方式
UML类图

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

抽象类及实体类
Food抽象类
package com.mashibing.dp.abstractfactory;public abstract class Food {abstract void printName();}
Bread类
package com.mashibing.dp.abstractfactory;public class Bread extends Food{public void printName() {System.out.println("wdm");}}
MashRoom类
package com.mashibing.dp.abstractfactory;public class MushRoom extends Food{public void printName() {System.out.println("dmg");}}
Weapon抽象类
package com.mashibing.dp.abstractfactory;public abstract class Weapon {abstract void shoot();}
AK47类
package com.mashibing.dp.abstractfactory;public class AK47 extends Weapon{public void shoot() {System.out.println("tututututu....");}}
MagicStick类
package com.mashibing.dp.abstractfactory;public class MagicStick extends Weapon{public void shoot() {System.out.println("diandian....");}}
抽象工厂AbstractFactory
package com.mashibing.dp.abstractfactory;public abstract class AbstractFactory {abstract Food createFood();// abstract Vehicle createVehicle();abstract Weapon createWeapon();}
ModernFactory类
package com.mashibing.dp.abstractfactory;public class ModernFactory extends AbastractFactory {@OverrideFood createFood() {return new Bread();}// @Override// Vehicle createVehicle() {// return new Car();// }@OverrideWeapon createWeapon() {return new AK47();}}
MagicFactory类
package com.mashibing.dp.abstractfactory;public class MagicFactory extends AbastractFactory {@OverrideFood createFood() {return new MushRoom();}// @Override// Vehicle createVehicle() {// return new Broom();// }@OverrideWeapon createWeapon() {return new MagicStick();}}
工厂的使用
package com.mashibing.dp.abstractfactory;public class Main {public static void main(String[] args) {AbastractFactory f = new ModernFactory();// Vehicle c = f.createVehicle();// c.go();Weapon w = f.createWeapon();w.shoot();Food b = f.createFood();b.printName();}}
存在问题(工厂模式探讨)
- 什么时候用接口,什么时候用抽象类
- 在设计时有时用接口和抽象类都可以,但是要注意语义问题
- 抽象类是实实在在存在的事物,只不过相对抽象一点并没有那么具体,但仍是实实在在存在的事物
- 形容词用接口,名词用抽象类(Moveable接口和Vehicle是抽象类)
- 实现接口是has-a的关系,继承抽象类是is-a的关系
- 也可以有工厂的工厂—->灵活的设计方式,在实际中怎么合适怎么来设计(手中无剑,心中有剑,越来越锋利)
- ⭐工厂方法模式适合产品上的扩展(加产品+加工厂),而抽象工厂模式在产品族内部种类的维度上拓展比较容易,但在产品族种类的维度上不好拓展(得在工厂中加一堆的方法)——>解决方案:spring的bean工厂
🤏随想
- maven不能本控制工具(idea中addFramework加一下maven)
- maven怎么解决依赖冲突的(就近原则)
- 两个包分别要依赖一个库,但是依赖的版本不一样就会出现问题,maven会帮你管理这种依赖版本冲突的问题(向下兼容、就近原则?)


