工厂方法
工厂方法模式的核心是工厂类不再负责所有产品的创建,而是将具体的创建工作交给它的实现类去做。这样,工厂类成为一个抽象角色,它仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类怎么被创建的细节。
工厂方法模式的核心是一个抽象工厂类,它允许具体工厂类从抽象工厂类中将创建行为继承下来。
原则:
- 为每个产品提供统一的接口
- 为每个产品提供单独的工厂
- 为工厂类提供统一的接口
特点:
- 一个抽象的产品类,可以派生出多个具体的产品类。
- 一个抽象的工厂类,可以派生出多个具体的工厂类。
- 每个具体的工厂类只能创建一个具体的产品类的实例。
- 每增加一个产品只要增加相应的工厂方法即可。这种设计的优势是能够方便的增加产品,但可能会导致工厂泛滥。
- 产品接口
public interface Traffic {
void run();
void brake();
}
- 产品类
public class Audi implements Traffic {
@Override
public void run() {
System.out.println("audi run");
}
@Override
public void brake() {
System.out.println("audi brake");
}
}
public class Benz implements Traffic {
@Override
public void run() {
System.out.println("benz run");
}
@Override
public void brake() {
System.out.println("benz brake");
}
}
public class BMW implements Traffic {
@Override
public void run() {
System.out.println("bmw run");
}
@Override
public void brake() {
System.out.println("bmw brake");
}
}
- 工厂接口:
public interface TrafficFactory {
Traffic create();
}
- 工厂类:
public class AudiFactory implements TrafficFactory {
@Override
public Traffic create() {
return new Audi();
}
}
public class BenzFactory implements TrafficFactory {
@Override
public Traffic create() {
return new Benz();
}
}
public class BMWFactory implements TrafficFactory {
@Override
public Traffic create() {
return new BMW();
}
}
- 测试代码:
public static void main(String[] args) {
TrafficFactory factory ;
// factory =new AudiFactory();
//factory = new BenzFactory();
factory = new BMWFactory();
Traffic traffic = factory.create();
traffic.run();
traffic.brake();
}