文章目录
概述简单工厂模式工厂方法模式抽象工厂模式反射工厂
概述
满足OOP七大原则中:
开闭原则依赖倒置法则迪米特法则
枚举工厂的实现
简单工厂模式
类接口
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
;
}
}
car.properties
bmw
=com
.javasm
.factory
.BMW
benz
=com
.javasm
.factory
.BENZ
Icar模板
public interface Icar {
void run();
void stop();
}