工厂模式
工厂模式
一. 简单工厂模式
这个模式本身比较简单,可以使用在业务较简单的情况下!
1. 抽象一个基类或者接口
public abstract class Computer {
}
2. 多个实现类
public class HUAWEIComputer extends Computer {
}
public class LenovoComputer extends Computer {
}
3. 工厂类最顶层的抽象类
public abstract class FactoryAbstract {
public abstract Computer create();
}
4. 各个实现类的工厂类
public class HUAWEIComputerFactory extends FactoryAbstract {
@Override
public Computer create(){
return new HUAWEIComputer();
}
}
public class LenovoComputerFactory extends FactoryAbstract {
@Override
public Computer create(){
return new LenovoComputer();
}
}
二. 工厂方法模式
工厂方法模式主要解决产品扩展的问题
工厂方法模式(Fatory Method Pattern)是通过实现类的工厂类来决定实例化哪个实现类的,工厂方法让类的实例化推迟到子类中进行。在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符 合开闭原则
1. 抽象一个基类或者接口
public abstract class Computer {
}
2. 多个实现类
public class HUAWEIComputer extends Computer {
}
public class LenovoComputer extends Computer {
}
4. 多个实现类的工厂类
public class LenovoComputerFactory extends FactoryAbstract {
@Override
public Computer create(){
return new LenovoComputer();
}
}
public class HUAWEIComputerFactory extends FactoryAbstract {
@Override
public Computer create(){
return new HUAWEIComputer();
}
}
总结
在简单工厂中,随着产品链的丰富,但是如果每个 产品的创建逻辑有区别的话,工厂的职责会变得越来越多,有点像万能工厂,并不便于维护,工厂方法模式就解决了这种问题,每个实现类都有自己的工厂,专人做专事
工厂方法的缺点:
-
类的个数容易过多,增加复杂度。
-
增加了系统的抽象性和理解难度
三. 抽象工厂模式
抽象工厂模式要比工厂方法模式复杂一点,工厂方法模式类似于一对多的关系,抽象工厂模式就像是多对多的关系,类似于多个产品,多个不同的品牌
打个比方:华为不仅仅生产电脑,还生产手机… 联想也是… …也是
这种就可以使用抽象工厂模式
1. 多个产品的抽象类
public abstract class Computer {
}
public abstract class Phone {
}
2. 多个品牌的实现多个产品
华为:
public class HUAWEIComputer extends Computer {
}
public class HUAWEIPhone extends Phone {
}
联想:
public class LenovoComputer extends Computer {
}
public class LenovoPhone extends Phone {
}
3. 工厂类的*抽象类
public abstract class Factory {
public abstract Phone createPhone();
public abstract Computer createComputer();
}
4. 各个品牌的工厂类
public class HUAWEIFactory extends Factory {
@Override
public Phone createPhone() {
return new HUAWEIPhone();
}
@Override
public Computer createComputer() {
return new HUAWEIComputer();
}
}
public class LenovoFactory extends Factory {
@Override
public Phone createPhone() {
return new HUAWEIPhone();
}
@Override
public Computer createComputer() {
return new HUAWEIComputer();
}
}
抽象工厂模式很清楚的展示了多个产品和多个工厂的关系。但是,如果再继续扩展产品,那么代码从抽象工厂,到具体工厂要全部修改,很显然不符合开闭原则。因此抽象工厂也是 有缺点的:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂 的接口
- 增加了系统的抽象性和理解难度。