作用:实现了创建者和调用者分离
分类:
- 简单工厂模式:用来生产同一等级结构中的任意产品(对于新增的产品,需要扩展已有代码)
public interface Car {
void name();
}
//静态工厂模式
//对于增加一个新的产品,如果不修改代码就做不到
//大多数情况下就是使用这种简单工厂模式,为了满足开闭原则会付出很大的代价==》工厂方法模式
public class CarFactory {
//方法一
public static Car getCar(String car){
if(car.equals("五菱"))
{
return new Wuling();
}else if(car.equals("特斯拉"))
{
return new Tesla();
}else
{
return null;
}
}
//方法二
public static Car getDazhong(){
return new Dazhong();
}
}
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 Consumer {
public static void main(String[] args) {
/* 原始方式创建
需要知道接口,所有的实现类
Car car=new Wuling();
Car car1=new Tesla();
car.name();
car1.name();*/
//使用工厂创建
Car car=CarFactory.getCar("五菱");
Car car1=CarFactory.getCar("特斯拉");
car.name();
car1.name();
}
}
- 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
public interface Car {
void name();
}
//工厂方法模式
//随时动态扩展,满足开闭原则,但是每多一个产品就会多一个扩展类
public interface CarFactory {
Car getCar();
}
//结构复杂度
/* simple
* 代码复杂度
* simple
* 编程复杂度
* simple
* 管理复杂度
* simple*/
//根据设计原则:应该使用工厂方法模式
//根据实际业务:应该使用简单工厂模式
public class Mobai implements Car{
@Override
public void name() {
System.out.println("摩拜单车");
}
}
public class MobaiFactory implements CarFactory{
@Override
public Car getCar() {
return new Mobai();
}
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉");
}
}
public class TeslaFactory implements CarFactory{
@Override
public Car getCar() {
return new Tesla();
}
}
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光");
}
}
public class Consumer {
public static void main(String[] args) {
Car car1=new WulingFactory().getCar();
Car car2=new TeslaFactory().getCar();
Car car3=new MobaiFactory().getCar();
car1.name();
car2.name();
car3.name();
}
}
- 抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂(关注产品等级+产品族),当产品更加稳定时会更有效率
不增加具体的产品,但是可以增加产品族(生产厂商)
核心本质:
- 实例化对象不适用new,用工厂方法代替
- 将选择实现类,创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
总结:
- 简单工厂模式:虽然不符合设计原则,但实际使用最多
- 工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展(符合设计原则)
- 抽象工厂模式:不可以增加产品但是可以增加产品族
应用:
- JDK中的Calendar的getInstance方法
- JDBC中的Connection对象的获取
- Spring中IOC容器创建管理bean对象
- 反射中Class对象的newInsetance方法