工厂方法模式
- 要点
- 为了避免简单工厂模式的缺点,不完全满足OCP(开闭原则)。
- 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。
简单工厂和工厂方法模式比较
结构复杂度
从这个角度比较,显然简单工厂模式要占优,简单工厂模式只需一个工厂类,而工厂方法模式的工厂类随着产品类个数增加而增加,这无疑会使类的个数越来越多,从而增加了结构的复杂程度。
代码复杂度
代码复杂度和结构复杂度一样矛盾,既然简单工厂模式在结构方面相对简洁,那么它在代码方法肯定是比工厂方法模式复杂的了。简单工厂模式的工厂类随着产品的增加需要增加很多方法(或代码),而工厂方法模式每个具体工厂类中完成单一任务,代码简洁。
根据设计理论建议:工厂方法模式。但是实际上我们一般都用简单工厂模式。
工厂方法模式示例代码
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 16:32
*/
public class Audi implements Car {
@Override
public void run() {
System.out.println("奥迪再跑!");
}
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 18:32
*/
public class AudiFactory implements CarFactory{
@Override
public Car createCar(){
return new Audi();
}
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 18:59
*/
public class Benz implements Car {
public void run() {
System.out.println("奔驰再跑!");
}
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 19:00
*/
public class BenzFactory implements CarFactory{
@Override
public Car createCar() {
return (new Benz());
}
}
package com.yishan.factory.factorymethod;
import com.yishan.factory.simplefactory.Car;
/**
* @author : yishan
* @date : 2020-09-16 16:33
*/
public class Byd extends Audi implements Car{
@Override
public void run() {
System.out.println("比亚迪再跑!");
}
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 18:32
*/
public class BydFactory implements CarFactory{
@Override
public Car createCar() {
return new Byd();
}
}
package com.yishan.factory.factorymethod;
/**
* 接口方法
* @author : yishan
* @date : 2020-09-16 16:31
*/
public interface Car {
void run();
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 18:31
*/
public interface CarFactory {
Car createCar();
}
package com.yishan.factory.factorymethod;
/**
* @author : yishan
* @date : 2020-09-16 18:35
*/
public class Client {
public static void main(String[] args) {
Car c1 = new AudiFactory().createCar();
Car c2 = new BydFactory().createCar();
c1.run();
c2.run();
}
}