简单工厂:
代码分析:
由上图可以看出,当顾客需要购买车时不需要了解一个车是怎么生产出来的,只需和车工厂进行交互即可,一个个的品牌的车对象都是由车工场来创建的。
Car接口中规定了车的名称,不同品牌的车类实现了该接口,而CarFactory类和不同品牌的车采用组合的关系给用户提供car不同品牌的car对象。
缺点: 不满足开闭原则。 eg:当新增加一个车车品牌时,就要对车工场的代码进行修改。
代码实例:
//Car接口
public interface Car {
void name();
}
//实现Car接口的两个品牌
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
//CarFactory
//车工场,目的是将对象的调用者和使用者向分离
public class CarFactory {
//简单工厂模式实现的两种方法
//方法1:
public static Car getCar(String car){
if(car.equals("五菱")){
return new Wuling();
}else if(car.equals("特斯拉")){
return new Tesla();
}else{
return null;
}
}
//方法2:
public static Car getWuling(){
return new Wuling();
}
public static Car getTesla(){
return new Tesla();
}
//新需求:当需要添加一个新的车型时: eg 大众新品牌
//需要修改车工场的代码因此也叫静态工厂。
}
//消费者:
//消费者无需自己创建车 只需去车工场去拿就行
//消费者只需面对车工厂就行 而无需了解到车的生产细节
//没有满足开闭原则
public class Comsumer {
public static void main(String[] args) {
Car car = CarFactory.getCar("五菱");
Car car1 = CarFactory.getCar("特斯拉");
car.name();
car1.name();
}
}
工厂方法:
代码分析:
相当于是加了一层的CarFactory接口(将原来的CarFactory类编程接口进行约束),从而实现了开闭原则。
然而在实际的开发中,CarFactory接口的实现类是不用采用new关键字进行声明的而是采用反射和配置文件的方式进行动态的生成工厂对象。具体:在配置文件中(eg:XML中写入类的名称),然后读取XML中类的名称,在采用反射的方式进行动态的创建对象。
代码实例:
//Car接口
public interface Car {
void name();
}
//两种品牌的车
public class Wuling implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
//CarFactory接口
public interface CarFactory {
Car getCar();
}
//两种品牌实现的各自车工厂接口:
public class WulingFactory implements CarFactory {
@Override
public Car getCar() {
return new Wuling();
}
}
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
//顾客类:
public class Comsumer {
public static void main(String[] args) {
Car car = new WulingFactory().getCar();
Car car1 = new TeslaFactory().getCar();
//消费者需要的摩拜单车
Car car2 = new MobikeFactory().getCar();
car.name();
car1.name();
//摩拜单车
car2.name();
}
}