- 简单工厂
- 静态工厂(简单工厂中方法是静态时的特例)
- 工厂方法
- 抽象工厂
- 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{
@Override
public void go() {
System.out.println("broom flying chuachuachua .....");
}
}
简单工厂
package com.mashibing.dp.factorymethod;
/**
* 简单工厂的可扩展性不好
*/
public class SimpleVehicleFactory {
public Car createCar() {
//before processing
return 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 {
@Override
Food createFood() {
return new Bread();
}
// @Override
// Vehicle createVehicle() {
// return new Car();
// }
@Override
Weapon createWeapon() {
return new AK47();
}
}
MagicFactory类
package com.mashibing.dp.abstractfactory;
public class MagicFactory extends AbastractFactory {
@Override
Food createFood() {
return new MushRoom();
}
// @Override
// Vehicle createVehicle() {
// return new Broom();
// }
@Override
Weapon 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会帮你管理这种依赖版本冲突的问题(向下兼容、就近原则?)