工厂模式实现了创建者和调用者的分离,实例化对象不使用new,用工厂方法代替,将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
1,静态工厂模式也称简单工厂模式
public interface Car {
void name();
}
public class TeSla implements Car{
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class WuLing implements Car{
@Override
public void name() {
System.out.println("五菱宏光");
}
}
/**
* 静态工厂模式
* 也称简单工厂模式
* 无论哪种方法无法满足开闭原则,
* 对于新产品,要修改工厂的代码
*/
public class CarFactory {
/**通过工厂获取
* 方法一
* 所有类型的车只有一个车工厂
*/
public static Car getCar(String str){
if(str.equals("五菱")){
return new WuLing();
}else if(str.equals("特斯拉")){
return new TeSla();
}else{
return null;
}
}
/**
* 方法二
* 每种类型的车一个工厂
*/
public static Car getWuling(){
return new WuLing();
}
public static Car getTeSl(){
return new TeSla();
}
}
/**
* 消费者
*/
public class Consumer {
public static void main(String[] args) {
//传统的方式获取车 通过new对象
/*Car car = new WuLing();
Car car1 = new TeSla();
car.name();
car1.name();*/
Car car2 = CarFactory.getCar("五菱");
Car car3 = CarFactory.getCar("特斯拉");
car2.name();
car3.name();
}
}
无法满足开闭原则,对于新产品,要修改代码,
2,工厂方法模式
public interface Car {
void name();
}
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
public class TeSla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
/**
* 工厂方法模式
* 这种形式新增一个车得新增一个车工厂,
* 虽然满足的开闭原不改变工厂代码,
* 但是代码量明细增多
*/
public interface CarFactory {
Car getCar();
}
public class TeSlaFactory implements CarFactory{
@Override
public Car getCar() {
return new TeSla();
}
}
public class WuLingFactory implements CarFactory{
@Override
public Car getCar() {
return new WuLing();
}
}
/**
* 消费者
*/
public class Consumer {
public static void main(String[] args) {
Car car = new WuLingFactory().getCar();
Car car1= new TeSlaFactory().getCar();
car.name();
car1.name();
}
}
工厂方法模式这种形式新增一个车得新增一个车工厂,虽然满足的开闭原则,不改变工厂代码,但是代码量明细增多
总结:1,简单工厂模式虽然某种程度上不符合设计原则,但实际使用最多!,
2,工厂方法模式,不修改已有类的前提下,通过增加新的工厂类实现扩展。满足设计原则 但是代码量增多
应用场景:JDK中Calendar的getInstance方法,JDBC中的Connection对象的获取,Spring中IOC容器创建管理bean对象反射中,Class对象的newInstance方法