简单工厂
提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类
Car:定义客户所需要的功能接口;
aodi 或者bms Impl:具体实现Api的实现类,可能会有多个
Factory:工厂,选择合适的实现类来创建Api接口对象。
Client:客户端,通过Factory来获取Api接口对象,然后面向Api接口编程。
简单例子
public interface Car {
public void printInfo(); //打印汽车信息
}
BMW
package com.ghgcn.gof.simplefactory;
public class BMW implements Car {
private String brand = "宝马"; //品牌
private double price = 200000; //价格
@Override
public String toString() {
return "BMW{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
@Override
public void printInfo() {
System.out.println( "我是宝马:" );
System.out.println( this.toString() );
}
}
Aodi
package com.ghgcn.gof.simplefactory;
public class AoDi implements Car {
private String brand = "奥迪"; //品牌
private double price = 100000; //价格
@Override
public String toString() {
return "AoDi{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
@Override
public void printInfo() {
System.out.println( "我是奥迪:" );
System.out.println( this.toString() );
}
}
工厂
package com.ghgcn.gof.simplefactory;
public class CarFactory {
public static Car createCar(String type){
Car car = null;
if(type.equalsIgnoreCase("BMW")){
car = new BMW();
}else if(type.equalsIgnoreCase("aodi")){
car = new AoDi();
}
return car;
}
}
客户端
package com.ghgcn.gof.simplefactory;
public class CarTest {
public static void main(String[] args) {
Car bmw = CarFactory.createCar("bmw");
bmw.printInfo();
Car aoDi = CarFactory.createCar("AoDi");
aoDi.printInfo();
}
}
结果
简单工厂将对象的创建过程进行了封装,用户不需要知道具体的创建过程,只需要调用工厂类获取对象即可。
这种简单工厂的写法是通过switch-case来判断对象创建过程的。在实际使用过程中,违背了 开放-关闭原则,当然有些情况下可以通过反射调用来弥补这种不足。