GoF23 工厂模式学习笔记
工厂模式核心本质:
1. 实例化对象不使用new,用工厂方法代替
2. 将选择实现类,创建对象统一管理和控制,从而将调用者和实现类解耦
三种模式:
1. 简单工厂模式:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改原有代码)
2. 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
根据设计原则选择:工厂方法模式
根据实际业务选择:简单工厂模式(实际上这个用得更多)
3. 抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂
抽象工厂模式优点:
1. 具体产品在应用层进行隔离,无需关心创建细节
2. 将一系列产品统一到一起创建
抽象工厂模式缺点:
抽象工厂在稳定的情况下非常强大,但假设需要频繁扩展产品,所有类都必须做出相应修改
简单工厂模式
package factory. simple;
public interface Car {
void name ( ) ;
}
package factory. simple;
public class Ford implements Car {
@Override
public void name ( ) {
System. out. println ( "Ford" ) ;
}
}
package factory. simple;
public class Tesla implements Car {
@Override
public void name ( ) {
System. out. println ( "Tesla" ) ;
}
}
package factory. simple;
public class CarFactory {
public static Car getCar ( String name) {
switch ( name) {
case "Tesla" :
return new Tesla ( ) ;
case "Ford" :
return new Ford ( ) ;
default :
return null;
}
}
}
package factory. simple;
public class Consumer {
public static void main ( String[ ] args) {
Car tesla = CarFactory. getCar ( "Tesla" ) ;
Car ford = CarFactory. getCar ( "Ford" ) ;
tesla. name ( ) ;
ford. name ( ) ;
}
}
工厂方法模式
package factory. method;
public interface Car {
void name ( ) ;
}
package factory. method;
public interface CarFactory {
Car getCar ( ) ;
}
package factory. method;
public class Ford implements Car {
@Override
public void name ( ) {
System. out. println ( "Ford" ) ;
}
}
package factory. method;
public class FordCarFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Ford ( ) ;
}
}
package factory. method;
public class Tesla implements Car {
@Override
public void name ( ) {
System. out. println ( "Tesla" ) ;
}
}
package factory. method;
public class TeslaCarFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Tesla ( ) ;
}
}
package factory. method;
public class Consumer {
public static void main ( String[ ] args) {
Car ford = new FordCarFactory ( ) . getCar ( ) ;
Car tesla = new TeslaCarFactory ( ) . getCar ( ) ;
ford. name ( ) ;
tesla. name ( ) ;
}
}
很明显工厂方法模式容易扩展但其代码量很大。
抽象工厂模式
package factory_abstract;
public interface PhoneProduct {
void call ( ) ;
}
package factory_abstract;
public class HuaWeiPhone implements PhoneProduct {
@Override
public void call ( ) {
System. out. println ( "call with HuaWeiPhone" ) ;
}
}
package factory_abstract;
public class MiPhone implements PhoneProduct {
@Override
public void call ( ) {
System. out. println ( "call with MiPhone" ) ;
}
}
package factory_abstract;
public interface RouterProduct {
void wifi ( ) ;
}
package factory_abstract;
public class HuaWeiRouter implements RouterProduct {
@Override
public void wifi ( ) {
System. out. println ( "use wifi with HuaWeiRouter" ) ;
}
}
package factory_abstract;
public class MiRouter implements RouterProduct {
@Override
public void wifi ( ) {
System. out. println ( "use wifi with MiRouter" ) ;
}
}
package factory_abstract;
public interface ProductFactory {
PhoneProduct phoneProduct ( ) ;
RouterProduct routerProduct ( ) ;
}
package factory_abstract;
public class HuaWeiFactory implements ProductFactory {
@Override
public PhoneProduct phoneProduct ( ) {
return new HuaWeiPhone ( ) ;
}
@Override
public RouterProduct routerProduct ( ) {
return new HuaWeiRouter ( ) ;
}
}
package factory_abstract;
public class MiFactory implements ProductFactory {
@Override
public PhoneProduct phoneProduct ( ) {
return new MiPhone ( ) ;
}
@Override
public RouterProduct routerProduct ( ) {
return new MiRouter ( ) ;
}
}
package factory_abstract;
public class Consumer {
public static void main ( String[ ] args) {
HuaWeiFactory huaWeiFactory = new HuaWeiFactory ( ) ;
PhoneProduct huaWeiPhone = huaWeiFactory. phoneProduct ( ) ;
RouterProduct huaWeiRouter = huaWeiFactory. routerProduct ( ) ;
huaWeiPhone. call ( ) ;
huaWeiRouter. wifi ( ) ;
MiFactory miFactory = new MiFactory ( ) ;
PhoneProduct miPhone = miFactory. phoneProduct ( ) ;
RouterProduct miRouter = miFactory. routerProduct ( ) ;
miPhone. call ( ) ;
miRouter. wifi ( ) ;
}
}