工厂模式
- 简单工厂,严格来说,简单工厂并不是一个设计模式
- 工厂方法,管理产品等级,比如工厂只负责生产该品牌下的鼠标,或者只负责生产该品牌下的键盘
- 抽象工厂,管理产品族,工厂会生产同一品牌的鼠标和键盘
简单工厂的实现实例
public class MouseFactory {
/**
* 通过传入的类型来决定具体创建DellMouse还是HpMouse
*/
public static Mouse createMouse(int type) {
switch (type) {
case 0:
return new DellMouse();
case 1:
return new HpMouse();
default:
return new DellMouse();
}
}
public static void main(String[] args) {
MouseFactory.createMouse(1).sayHi();
}
}
>>> 我是惠普鼠标
缺点,如果需要新增一个实现类就需要修改简单工厂的代码,这违反了软件设计原则中的开闭原则
工厂方法
管理一种产品的生产(产品等级)
- 首先有一个顶层的工厂
- 该工厂会有几个实现工厂
- 具体的实现工厂来生产具体的产品
// 鼠标工厂
public interface MouseFactory {
Mouse createMouse();
}
// 惠普鼠标工厂
// 负责生产惠普鼠标
public class HpMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
}
// 戴尔鼠标工厂
// 负责生产戴尔鼠标
public class DellMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
}
// 测试类
public static void main(String[] args) {
// 创建戴尔鼠标工厂
MouseFactory factory = new DellMouseFactory();
// 生产戴尔鼠标
Mouse mouse = factory.createMouse();
mouse.sayHi();
}
>>> 我是戴尔鼠标
缺点: 如果我们需要增加一种新的产品,那么需要新增一系列的类似代码,这样会导致类爆炸
抽象工厂
管理一系列产品的生产(产品族)
// 电脑工厂
public interface ComputerFactory {
Mouse createMouse();
Keyboard createKeyboard();
}
// 戴尔电脑工厂
public class DellComputerFactory implements ComputerFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
@Override
public Keyboard createKeyboard() {
return new DellKeyboard();
}
}
// 惠普电脑工厂
public class HpComputerFactory implements ComputerFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
@Override
public Keyboard createKeyboard() {
return new HpKeyboard();
}
}
// 测试类
public class FactoryAbstractDemo {
public static void main(String[] args) {
ComputerFactory hpComputer = new HpComputerFactory();
hpComputer.createKeyboard().sayHello();
hpComputer.createMouse().sayHi();
}
}
>>> 我是惠普键盘
>>> 我是惠普鼠标
缺点:如果我们需要新增一个屏幕产品,那么还是需要修改所有的已存在的类,并不能实现开闭原则