抽象工厂介绍:
抽象工厂为不同产品族的对象创建提供接口。
使用场景:系统需要在不同产品族进行切换
在以下情况下可以考虑使用抽象工厂模式:
(1) 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的,用户无须关心对象的创建过程,将对象的创建和使用解耦。
(2) 系统中有多于一个的产品族,而每次只使用其中某一产品族。可以通过配置文件等方式来使得用户可以动态改变产品族,也可以很方便地增加新的产品族。
(3) 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。同一个产品族中的产品可以是没有任何关系的对象,但是它们都具有一些共同的约束,如同一操作系统下的按钮和文本框,按钮与文本框之间没有直接关系,但它们都是属于某一操作系统的,此时具有一个共同的约束条件:操作系统的类型。
(4) 产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。
代码实现:
1抽象3个接口(Car, Person, Factory):
public abstract class Car {
public abstract void showCar();
}
public abstract class Person {
public abstract void showPerson();
}
public interface Factory {
public Car createCar();
public Person createPerson();
}
2,实现接口类
public class Bike extends Car {
public void showCar(){
System.out.println("-----Bike showCar");
}
}
public class SuvCar extends Car {
@Override
public void showCar() {
System.out.println("-----SuvCar showCar");
}
}
public class Student extends Person {
@Override
public void showPerson(){
System.out.println("-----Student showPerson");
}
}
public class Worker extends Person {
@Override
public void showPerson(){
System.out.println("----Worker showPerson");
}
}
3,工厂实现类
public class StudentFactory implements Factory {
@Override
public Person createPerson(){
return new Student();
}
@Override
public Car createCar() {
return new Bike();
}
}
public class WorkerFactory implements Factory {
@Override
public Person createPerson(){
return new Worker();
}
@Override
public Car createCar(){
return new SuvCar();
}
}
4,测试
public class FactoryMain {
public static void main(String[] args){
Factory factory = new StudentFactory();
Car bCar = factory.createCar();
Person stu = factory.createPerson();
bCar.showCar();
stu.showPerson();
Factory factory2 = new WorkerFactory();
Car suv = factory2.createCar();
Person worker = factory2.createPerson();
suv.showCar();
worker.showPerson();
}
}
结果:
-----Bike showCar
-----Student showPerson
-----SuvCar showCar
----Worker showPerson
总结:
1,让具体的创建对象实例和客户端分离
2,便于交换产品系列