1.普通造车模式
车的接口:
package com.zhou.factory;
public interface Car {
public void run();
}
比亚迪车
package com.zhou.factory;
public class BiyadiCar implements Car{
@Override
public void run() {
System.out.println("比亚迪");
}
}
吉利车
package com.zhou.factory;
public class JiliCar implements Car{
@Override
public void run() {
System.out.println("吉利汽车");
}
}
特斯拉
package com.zhou.factory;
public class TeslaCar implements Car{
@Override
public void run() {
System.out.println("特斯拉");
}
}
这3种车都实现了car接口
消费者
package com.zhou.factory;
public class Consumer {
public static void main(String[] args) {
// 普通造车模式
Car biyadi = new BiyadiCar();
Car jili = new JiliCar();
biyadi.run();
jili.run();
}
}
缺点:用户需要了解Car接口和它的实现类,才能在Consumer类中new一个相应的对象
2简单工厂模式 对1这种普通模式的改进
在1的基础上加上一层(架构中没有什么是加一层解决不了的,如果有,那就加两层)
加一层车工厂
package com.zhou.factory;
public class CarFactory {
public Car getCar(String name){
if (name.equals("biyadi"))
return new BiyadiCar();
else if (name.equals("tesla"))
return new TeslaCar();
else if (name.equals("jili"))
return new JiliCar();
return null;
}
}
消费者
package com.zhou.factory;
public class Consumer {
public static void main(String[] args) {
/*// 普通造车模式
Car biyadi = new BiyadiCar();
Car jili = new JiliCar();
biyadi.run();
jili.run();*/
// 简单工厂模式
CarFactory c = new CarFactory();
c.getCar("biyadi").run();
c.getCar("jili").run();
}
}
用户只需要知道车的名字,即可调用车工场返回相应车的对象,无需知道Car接口和它的实现类,方便实用
缺点:每添加一个新一种车,就要改动车工厂的代码,不满足开闭原则
3 工厂方法模式 对2的进一步改进
将车工厂抽象成一个接口
package com.zhou.method;
public interface CarFactory {
public Car getCar();
}
每种车有对应的车工厂(实现了车工厂的接口)
例如比亚迪
package com.zhou.method;
public class BiyadiCarFactory implements CarFactory{
@Override
public Car getCar() {
return new BiyadiCar();
}
}
每次新来一种车只需要实现这种车实现Car接口,这种车工厂实现CarFactory接口,完成解耦,满足开闭原则
但是增加了代码量,实际中更偏向于选择第二种简单工厂模式。