工厂模式
在这一篇,我会把工厂模式和抽象工厂模式两个梵高一起来讲
1.简单工厂模式
/**
* @author: hx
* @Time: 2019/5/6
* @Description: Producer
*/
public interface Car {
/**
* 车的基本方法和属性
*/
void brand();
}
/**
* @author: hx
* @Time: 2019/5/6
* @Description: Ferrari
*/
public class Ferrari implements Car {
@Override
public void brand() {
System.out.println("法拉利");
}
}
/**
* @author: hx
* @Time: 2019/5/6
* @Description: Porsche
*/
public class Porsche implements Car {
@Override
public void brand() {
System.out.println("保时捷");
}
}
/**
* @author: hx
* @Time: 2019/5/6
* @Description: CarFactory生产车的工厂
*/
public class CarFactory {
public Car produce(String brand) {
switch(brand){
case "Ferrari":
return new Ferrari();
case "Porsche":
return new Porsche();
default:
return null;
}
}
}
简单工厂可以看出来,抽取一个所有车都公有的接口,接口中包含所有车的共同属性和方法,如品牌或者自动驾驶。每个车各自实现自己的方法的内容。在Car工厂中,根据不同的品牌生产不同的车,并出厂。
2.工厂方法模式
为了防止在普通工厂方法模式中,传递的字符串出错而不能正确创建对象,工厂方法模式提供多个工厂方法,分别创建对象。
/**
* @author: hx
* @Time: 2019/5/6
* @Description: CarFactory生产车的工厂
*/
public class CarFactory {
public Car produceFerrari(){
return new Ferrari();
}
public Car producePorsche(){
return new Porsche();
}
}
3.静态工厂方法模式
这个模式和上面其实没有区别,只是将生产的方法改为了静态方法
/**
* @author: hx
* @Time: 2019/5/6
* @Description: CarFactory生产车的工厂
*/
public class CarFactory {
public static Car produceFerrari(){
return new Ferrari();
}
public static Car producePorsche(){
return new Porsche();
}
}
4.抽象工厂模式
上面的工厂模式,可以看出一个问题,就是每次我们需要新增加一个产品的时候,都需要对原来的工厂类里面的代码进行修改,这样在扩展代码的时候,违背了闭包的原则。也即是,当你原来的工厂里面生产保时捷和法拉利,所以工厂里面有两条生产线,但是如果你还想在生产奔驰,那怎么办呢,你得在原来的工厂里面去改造,新增一个生产线,这样势必会影响另外两条生产线的生产工作,所以,我们不如直接给每种车单独建立一个工厂,每个工厂只生产一个品牌的车,这样,新增一个品牌的车,也不对对其他的工厂有影响,这就是抽象工厂。下面,修改一下代码。
新增一个生产车的接口,让所有的工厂去继承,分别去实现生产车的方法,这样新增一个类型,直接继承生产的接口,生产自己的车,不需要修改任何代码,只需要增加一个工厂和一个车类型。
/**
* @author: hx
* @Time: 2019/5/6
* @Description: Producing
*/
public interface Producing {
Car ProduceCar();
}
/**
* @author: hx
* @Time: 2019/5/6
* @Description: FerrariFactory
*/
public class FerrariFactory implements Producing {
@Override
public Car ProduceCar() {
return new Ferrari();
}
}
/**
* @author: hx
* @Time: 2019/5/6
* @Description: PorscheFactory
*/
public class PorscheFactory implements Producing {
@Override
public Car ProduceCar() {
return new Porsche();
}
}
public static void main(String[] args){
Producing ferrariFactory = new FerrariFactory();
Car ferrari = ferrariFactory.ProduceCar();
Producing porscheFactory = new PorscheFactory();
Car porsche = porscheFactory.ProduceCar();
}