工厂方法模式示例
工厂方法模式(FACTORY METHOD) 是一种常用的对象创建型设计模式,此模式的核心精神是封装类中不变的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用合方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂,具体工厂,抽象产品,具体产品。这段文字是从百度百科上copy过来的。
1、抽象工厂
public interface FactoryCar {
Car createCar();
}
public class FactoryBMW implements FactoryCar {
@Override
public BMW createCar() {
return new BMW();
}
}
public class FactoryWV implements FactoryCar {
@Override
public WV createCar() {
return new WV();
}
}
public abstract class Car {
public void print() {}
//获得行驶最大速度
public int getMaxSpeed() {
return 0;
}
//获得油耗
public double getFuelConsume() {
return 0.0;
}
}
添加这几个方法的目的是为了好理解,汽车共有的特性,但是数据不同。
4、具体方法
public class BMW extends Car {
private static final String TAG = "car";
private double consume = 8.8;
private int speed = 165;
public BMW() {
}
@Override
public void print() {
super.print();
Log.e(TAG, "print: 宝马系列-MaxSpeed = " + speed + " / FuelConsume = " + consume);
}
@Override
public int getMaxSpeed() {
return speed;
}
@Override
public double getFuelConsume() {
return consume;
}
}
public class WV extends Car {
private static final String TAG = "car";
private double consume = 6.8;
private int speed = 168;
public WV() {
}
@Override
public void print() {
super.print();
Log.e(TAG, "print: 大众系列-MaxSpeed = " + speed + " / FuelConsume = " + consume);
}
@Override
public int getMaxSpeed() {
return speed;
}
@Override
public double getFuelConsume() {
return consume;
}
}
6、工厂方法模式比简单工厂模式好的地方就是添加新的车型不需要在原来的代码上修改或添加。我们只需要添加一个/** * 通过汽车工厂获得我们需要的车型 */ factoryBMW = new FactoryBMW(); BMW bmw = factoryBMW.createCar(); mBmw.setText("宝马-油耗: " + bmw.getFuelConsume() + " L/100km - 最高速度: " + bmw.getMaxSpeed() + " km/h"); bmw.print(); factoryWV = new FactoryWV(); WV wv = factoryWV.createCar(); mWv.setText("大众-油耗: " + wv.getFuelConsume() + " L/100km - 最高速度: " + wv.getMaxSpeed() + " km/h"); wv.print();
新的车型工厂就可以了,譬如:
public class FactoryBYD implements FactoryCar { @Override public BYD createCar() { return new BYD(); } }
public class BYD extends Car { private static final String TAG = "car"; private double consume = 9.8; private int speed = 135; public BYD() { } @Override public void print() { super.print(); Log.e(TAG, "print: 宝马系列-MaxSpeed = " + speed + " / FuelConsume = " + consume); } }
/** * 新添加的BYD车型 */ factoryBYD = new FactoryBYD(); BYD byd = factoryBYD.createCar(); byd.print();
对就是这么简单,有兴趣你也来试试吧。