概述
枚举工厂的实现
简单工厂模式
public interface Car {
void name ( ) ;
}
public class Audi implements Car {
@Override
public void name ( ) {
System. out. println ( "Audi" ) ;
}
}
public class Auto implements Car {
@Override
public void name ( ) {
System. out. println ( "Auto" ) ;
}
}
public class CarFactory {
public static Car getAudi ( ) {
return new Audi ( ) ;
}
public static Car getAuto ( ) {
return new Auto ( ) ;
}
}
public class Test {
public static void main ( String[ ] args) {
CarFactory. getAudi ( ) . name ( ) ;
CarFactory. getAuto ( ) . name ( ) ;
}
}
总结:不满足闭合原则(对扩展开放,对修改关闭),新增加实现类,需修改工厂类。
工厂方法模式
在简单工厂模式的基础上,再抽象出工厂接口,每个实现类设置自己的工厂。 CarFactory
public interface CarFactory {
Car getCar ( ) ;
}
public class AudiFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Audi ( ) ;
}
}
public class AutoFactory implements CarFactory {
@Override
public Car getCar ( ) {
return new Auto ( ) ;
}
}
public class Test {
public static void main ( String[ ] args) {
new AudiFactory ( ) . getCar ( ) . name ( ) ;
new AutoFactory ( ) . getCar ( ) . name ( ) ;
}
}
总结:工厂方法模式虽然满足设计原则,但复杂度更高;简单工厂模式更符合实际业务的选择。
抽象工厂模式
public interface PhoneProuct {
void start ( ) ;
void shutDown ( ) ;
void call ( ) ;
void sendMsg ( ) ;
}
public interface RouterProduct {
void start ( ) ;
void shutDown ( ) ;
void openWifi ( ) ;
void setting ( ) ;
}
public class XiaoMiPhone implements PhoneProuct {
@Override
public void start ( ) {
System. out. println ( "小米开机" ) ;
}
@Override
public void shutDown ( ) {
System. out. println ( "小米关机" ) ;
}
@Override
public void call ( ) {
System. out. println ( "小米打电话" ) ;
}
@Override
public void sendMsg ( ) {
System. out. println ( "小米发短信" ) ;
}
}
public class XiaoMiRouter implements RouterProduct {
@Override
public void start ( ) {
System. out. println ( "小米路由器开机" ) ;
}
@Override
public void shutDown ( ) {
System. out. println ( "小米路由器关机" ) ;
}
@Override
public void openWifi ( ) {
System. out. println ( "小米路由器打开wifi" ) ;
}
@Override
public void setting ( ) {
System. out. println ( "小米路由器发短信" ) ;
}
}
public class HuaWeiPhone implements PhoneProuct {
@Override
public void start ( ) {
System. out. println ( "华为开机" ) ;
}
@Override
public void shutDown ( ) {
System. out. println ( "华为关机" ) ;
}
@Override
public void call ( ) {
System. out. println ( "华为打电话" ) ;
}
@Override
public void sendMsg ( ) {
System. out. println ( "华为发短信" ) ;
}
}
public class HuaWeiRouter implements RouterProduct {
@Override
public void start ( ) {
System. out. println ( "华为路由器开机" ) ;
}
@Override
public void shutDown ( ) {
System. out. println ( "华为路由器关机" ) ;
}
@Override
public void openWifi ( ) {
System. out. println ( "华为路由器打开wifi" ) ;
}
@Override
public void setting ( ) {
System. out. println ( "华为路由器发短信" ) ;
}
}
public interface ProductFactory {
PhoneProuct phoneProuct ( ) ;
RouterProduct routerProduct ( ) ;
}
public class XiaoMiFactory implements ProductFactory {
@Override
public PhoneProuct phoneProuct ( ) {
return new XiaoMiPhone ( ) ;
}
@Override
public RouterProduct routerProduct ( ) {
return new XiaoMiRouter ( ) ;
}
}
public class HuaWeiFactory implements ProductFactory {
@Override
public PhoneProuct phoneProuct ( ) {
return new HuaWeiPhone ( ) ;
}
@Override
public RouterProduct routerProduct ( ) {
return new HuaWeiRouter ( ) ;
}
}
反射工厂
public class IcarFactory {
private IcarFactory ( ) { }
private Icar icar;
private static Properties properties;
static {
properties = new Properties ( ) ;
InputStream resourceAsStream = IcarFactory. class . getClassLoader ( ) . getResourceAsStream ( "car.properties" ) ;
try {
properties. load ( resourceAsStream) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
public static Icar getCar ( String carName) {
String clazz = properties. getProperty ( carName) ;
try {
Class< ? > aClass = Class. forName ( clazz) ;
return ( Icar) aClass. newInstance ( ) ;
} catch ( ClassNotFoundException e) {
return null;
} catch ( IllegalAccessException e) {
e. printStackTrace ( ) ;
} catch ( InstantiationException e) {
e. printStackTrace ( ) ;
}
return null;
}
}
bmw= com. javasm. factory. BMW
benz= com. javasm. factory. BENZ
public interface Icar {
void run ( ) ;
void stop ( ) ;
}