介绍
工厂模式的出现,在于我们创建对象时,希望不要对客户端暴露创建逻辑,而是通过一个共同的接口来指向新创建的对象。
何时使用:明确地计划在不同条件下创建不同实例对象
关键步骤:创建过程在工厂类中执行,通过一个方法返回给使用者。
优点:
一个调用者想创建一个对象,只要知道其名称就可以了。
扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
屏蔽产品的具体实现,调用者只关心产品的接口。
缺点:
- 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事
- 不符合开闭原则,工厂类即使写好,后期随着业务需求,仍然需要修改工厂类方法
核心思想:
- 我们将这个模式分为工厂类,使用类,产品类。将原本应用在使用类的具体创建对象逻辑代码抽出放置到工厂类的一个方法。使用类只需要传入参数,工厂类的该方法返回其类型相对应的产品类。
- 产品类最好实现一个接口。由一个超类来控制返回类型。这样方便向上转型,且符合六个原则中的依赖倒转原则和里氏代换原则
简单工厂
简单工厂并不是设计模式,而是一种编程习惯。
示例
产品超类
public interface Car{
public void print();
}
产品子类
public class BenZ implements Car{
public void print(){
System.out.print("我是奔驰");
}
}
public class BMW implements Car{
public void print(){
System.out.print("我是宝马");
}
}
public class Volkswagen implements Car{
public void print(){
System.out.print("我是大众");
}
}
工厂类
public class CarFactory{
public Car getCar(String type){
if(type==null){
return null;
}
if(type.equals("bmw")){
return new BMW();
}
if(type.equals("volkswagen")){
return new Volkswagen ();
}
if(type.equals("benz")){
return new BenZ();
}
return null;
}
}
使用类
public class CarStore{
public static void main(String[] args) {
CarFactory factory = new CarFacotry();
Car car = factory.getCar("benz");
car.print();
car = factory.getCar("bmw");
car.print();
car = factory.getCar("volkswagen");
car.print();
}
}