工厂方法模式
1.工厂方法模式的概述 1.1工厂模式是简单工厂模式的延伸,符合开闭原则的基础上,还可以在增加新的具体产品对象时不需要对已有系统做任何修改。
1.2工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪个类实例化,工厂方法模式让一个类的实例化延伸到其子类。(也就是说在工厂方法模式中,不再提供一个统一的工厂类来创建所有的产品对象,而是对于不同的产品提供不同的工厂。例如:宝马工厂生产宝马汽车,奔驰工厂生产奔驰汽车。。。。。)
2.工厂方法模式的结构 2.1模式结构:
(1):Product(抽象产品):定义产品的接口,是工厂方法模式所创建对象的超类型,产品对象的公共父类。
(2)具体产品:它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品一一对应。
(3)Factory(抽象工厂):在抽象工厂类中声明了工厂方法,用于返回同一个产品。
(4)具体工厂:抽象工厂的子类,实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。。。
例题:宝马(BMW)工厂制造宝马汽车,奔驰汽车(Benz)工厂制造奔驰汽车。使用工厂方法模式模拟该场景,要求绘制出相应的类图并用Java语言模拟实现。
(1)Car:充当抽象产品角色
public abstract class Car {
public abstract void run();
}
(2)BMW :充当具体的产品角色
public class BMW extends Car {
@Override
public void run() {
System.out.println("宝马车跑的快...");
}
}
(3)Benz:充当具体的产品角色
public class Benz extends Car{
@Override
public void run() {
System.out.println("奔驰车跑的块...");
}
}
(4)CarFactory:充当抽象工厂角色
public abstract class CarFactory {
public void run(){
Car car = this.produceCar();
car.run();
}
public abstract Car produceCar();
}
(5)BenzFactory:充当具体工厂角色
public class BenzFactory extends CarFactory{
@Override
public Car produceCar() {
Car car = new Benz();
return car;
}
}
(6)BMWFactory:充当具体工厂角色
public class BMWFactory extends CarFactory{
@Override
public Car produceCar() {
Car car = new BMW();
return car;
}
}
(7)客户端测试类。
public class Client {
public static void main(String[] args) {
CarFactory factory, factory1;
Car car,car1;
factory = new BenzFactory();
factory1 = new BMWFactory();
car = factory.produceCar();
car1 = factory1.produceCar();
car1.run();
car.run();
}
}
3.工厂模式的优点: (1)使用工厂方法来创建用户所需的产品,用户只要关心所需产品对应的工厂,无需关心创建的细节。 (2)所有的具体工厂类都具有同一抽象父类(本例中的CarFactory作为BMWFactory和BenzFactory 的父类)工厂能自行确定创建何种产品对象,而创建的细节完全封装在具体工厂中。 (3)如果新加入产品,就无需修改抽象工厂类和抽象产品类,也无需修改其他具体工厂和产品,而只用添加一个具体工厂和具体产品即可。增加系统的可扩展性,符合开闭原则
4.缺点: 添加新产品会增加具体工厂类和具体产品类,这无疑会增加系统的复杂度,带来更多的开销。。。
总结:当然这题可以使用反射机制并引入配置文件实现。(会更加灵活)具体的实现方式,下次发文详细说明。
最后:希望多多指教,共同进步,与君共勉!!!(争取一周写1-2篇有关Java设计模式的文章,临近期末也当做复习了。。。)
|