1.简单工厂模式:接口单一,只提供创建实例的功能
public class SimpleFatory{
public Car getName(String tag){
if("BMW".equals(tag)){
return new BMWCar();
}else if("AODI".equals(tag)){
return new AODICar();
}else {
return null;
}
}
}
public Interface Car{
String getName();
}
public class BMWCar implements Car{
@Override
public String getName(){ return "BMW";}
}
public class AODICar implements Car{
@Override
public String getName(){ return "AODI";}
}
缺点:
1.这个世界存在什么都生产的工厂吗?
2.随着具体的实例对象多时,方法过于臃肿,维护起来更恐怖
因为专一,所以专业,这个时候工厂方法就出现了
2.工厂方法模式
// 生成车的工厂类
public interface Factory{
Car getCar();
}
public BMWFactory implements Factory{
@Override
public Car getCar(){
return new BMWCar();
}
}
public AUDIFactory implements Factory{
@Override
public Car getCar(){
return new AUDICar();
}
}
public static void main(String [] args){
Factory factory1 = new BMWFactory();
System.out.println(factory1.getCar());
Factory factory2 = new AUDIFactory ();
System.out.println(factory2.getCar());
}
缺点:当一个人想要去买一辆宝马汽车的时候,那么他就要去找宝马工厂给他生产一辆;过几天又想要买一辆奔驰汽车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性
工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品
这个时候抽象工厂模式就出现了
3.抽象工厂模式
组合单个工厂模式抽象出来的一个可以解决某些问题的一个抽象的类,其实就是一个抽象类中包含多个不同等级的产品(一个等级的产品就是一个工厂模式)
比如农场 包含 动物、植物等,那么抽象出来的农场类中 包含动物类和植物类。单个的动物又能抽象出来一个动物的生成工厂,植物也是一样。
// 动物类
public interface Animal{
void getName();
}
// 植物类
public interface Plant{
void getName();
}
// 抽象工厂类 农场
public interface Farm{
Animal createAnimal();
Plant createPlant();
}
// 声明一个统一管理有关农场的控制类,面向接口编程,控制大局走向。这样如果进行动物、植物的扩展,只需要继承对应的抽象类即可,逻辑不用更改。
优缺点
- 当增加一个新的产品族时只需增加一个新的具体工厂,不需要修改原代码,满足开闭原则。
- 当产品族中需要增加一个新种类的产品时,则所有的工厂类都需要进行修改,不满足开闭原则。