工厂模式是Java中常用的设计模式,提供了一种创建对象的最佳方式,工厂模式是将对象实例化的过程封装在了工厂类中,然后对外提供一个方法用来获取对象
1.简单工厂模式
简单工厂不属于设计模式之一,因为它没有遵守开闭原则,实现方式就是在工厂类里面不断进行拓展,比如我们有一个汽车接口,我们如果要获得各种品牌汽车时,就从汽车工厂类中获取,如下:
public interface Car {
void run();
}
public class Aodi implements Car{
@Override
public void run() {
System.out.println("奥迪汽车行驶");
}
}
/*
汽车工厂
*/
public class CarFactory {
public static Car createCar(String name){
if(name.equals("aodi")){
Aodi aodi = new Aodi();
//aodi.
return aodi;
}
if(name.equals("bmw")){
return new Bmw();
}
if(name.equals("bc")){
return new BC();
}
return null;
}
}
优点:实现简单,适用于实现类少,扩展少的情况。
缺点:如果增加和修改产品,则需要修改工厂类,违背了开闭原则,如果扩展多,实现类多的情况下,会造成工厂类十分庞杂,不利于维护。
2.工厂方法模式
工厂方法模式对工厂也进行了抽象,然后再向下拓展出各种工厂,比如有一个汽车工厂接口,拓展出的工厂类就有奥迪汽车工厂类,大众汽车工厂类...,它们里面都只负责造自己的汽车。
如下:
public interface CarFactory {
Car createCar();
}
public class AodiFactory implements CarFactory{
@Override
public Car createCar() {
return new Aodi();
}
}
优点:符合开闭原则,每个品牌的汽车有自己的汽车工厂,代码结构清楚,拓展性好,有利于后期维护。
缺点:需要编写额外的代码,如果一个品牌的产品过多会有很多的工厂,比如奥迪汽车工厂,奥迪LED灯工厂...
3.抽象工厂模式
抽象工厂模式就是设计出品牌工厂,比如奥迪工厂,工厂内部既可以生产奥迪汽车,也可以生产奥迪LED灯...如下:
public interface Factory {
Car getCar();
LED getLed();
}
public class AodiFactory implements Factory{
@Override
public Car getCar() {
return new AodiCar();
}
@Override
public LED getLed() {
return new LED();
}
}
优点:同一品牌下的产品直接在对应品牌工厂中获取相应的产品,不用在创建出同一品牌下的多个产品工厂了,提高代码的健壮性。