废话不多说,直接上栗子;该模式的工厂分流程工厂和实例化对象工厂两部分:流程工厂定义在抽象类中;实例化对象工厂(工厂的本质)定义在扩展自抽象类的子类中。客户去创造一个实例时,选择哪一个子类,则就是创造了哪一个对象。
package jsoup;
/*工厂模式即抽象类提供一个可以创建对象的接口,创建实例的任务交给扩展该抽象类的子类;抽象类中的抽象方法叫做工厂方法;
言而简之,创建实例的任务交给子类去实现
*/
public class FactoryPattern {
public static void main(String[] args){
CarFactory bwm = new BWM(); //BWM实例的引用对象类型是CarFactory,这样才能用process()
bwm.process("small");
bwm.process("large");
}
}
//抽象的汽车工厂,其中的制造流程如车主体、轮子、门的制造是顺序流,并且不需要知道具体的汽车品牌;
abstract class CarFactory {
public Car process(String type){
Car car = createCar(type);
car.makeBody();
car.makeWheel();
car.makeDoor();
return car;
}
protected abstract Car createCar(String type); //该抽象工厂方法交给扩展该类的子类去实现;
}
class BWM extends CarFactory {
@Override
protected Car createCar(String type) { //BWM子类扩展自汽车工厂,并实现了抽象的工厂方法createCar();
Car car = null;
if(type=="small"){
car = new BWMSmallCar();
}
if(type == "large"){
car = new BMWLargeCar();
}
return car;
}
}
//Car的抽象类,一些不变的代码如车主体、轮子、门的构造已实现;
abstract class Car {
String name;
String type;
protected void makeBody(){
System.out.println(name +" and type " + type + " body is maked");
}
protected void makeWheel(){
System.out.println(name +" and type " + type +" wheels are maked");
}
protected void makeDoor(){
System.out.println(name +" and type " + type +" doors are maked");
}
protected String getName(){
return name;
}
}
//一些宝马汽车公司的具体汽车类型,其扩展了抽象汽车类Car;
class BWMSmallCar extends Car {
public BWMSmallCar(){
name = "BWMSmallCar";
type ="Small";
}
}
class BMWLargeCar extends Car{
public BMWLargeCar(){
name = "BMWLargeCar";
type = "Large";
}
}