前两篇学习的是简单工厂模式,工厂方法模式。简单工厂模式中,工厂类的方法是静态的,不能被子类继承,违反了开闭原则;工厂方法模式中,将工厂类设置为抽象或者接口形式,这样,当增加工厂的时候,我们只需要让其继承或者实现抽象工厂中的方法,而不需要修改工厂类中的内部逻辑。这里有一个疑问,既然工厂类中已经涉及到抽象或者接口的概念,为什么不叫抽象工厂模式呢?抽象工厂模式与工厂方法模式又有什么不同呢?
抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。
抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。而且使用抽象工厂模式还要满足以下条件:
1,系统中有多个产品族(工厂方法模式中只有一个产品族),而系统一次只可能消费其中一族产品。
2,同属于同一个产品族的产品以其使用。
抽象工厂模式的各个角色与工厂方法模式基本相同,这里就不重复了。
代码实例:
1,创建抽象工厂角色
public interface Driver {
public BusinessCar driveBusiness();
public SportCar driveSport();
}
2,创建具体工厂角色
public class BenzDriver implements Driver{
public BusinessCar driveBusiness() {
return new BenzBusinessDriver();
}
public SportCar driveSport() {
return new BenzSportDriver();
}
}
public class BmwDriver implements Driver{
<span style="white-space:pre"> </span>public BusinessCar driveBusiness() {
<span style="white-space:pre"> </span>return new BmwBusinessDriver();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public SportCar driveSport() {
<span style="white-space:pre"> </span>return new BmwSportDriver();
<span style="white-space:pre"> </span>}
}
3,创建抽象产品角色
public interface BusinessCar {
public void drive();
}
public interface SportCar {
<span style="white-space:pre"> </span>public void drive();
}
4,创建具体产品角色
public class BenzBusinessDriver implements BusinessCar {
public void drive() {
System.out.println("Drive Benz Business Car");
}
}
public class BenzSportDriver implements SportCar{
<span style="white-space:pre"> </span>public void drive() {
<span style="white-space:pre"> </span>System.out.println("Drive Benz Sport Car");
<span style="white-space:pre"> </span>}
}
public class BmwBusinessDriver implements BusinessCar{
<span style="white-space:pre"> </span>public void drive() {
<span style="white-space:pre"> </span>System.out.println("Drive Bmw Business Car");
<span style="white-space:pre"> </span>}
}
public class BmwSportDriver implements SportCar{
<span style="white-space:pre"> </span>public void drive() {
<span style="white-space:pre"> </span>System.out.println("Driver Bmw Sport Car");
<span style="white-space:pre"> </span>}
}
5,测试
public class DriverTest {
public static void main(String[] args){
Driver driver = new BenzDriver();
BusinessCar business = driver.driveBusiness();
business.drive();
SportCar sport = driver.driveSport();
sport.drive();
}
}
输出结果:Drive Benz Business Car
Drive Benz Sport Car