简单工厂模式:
有的对象属性过多,创建该对象时可能写大量的setter(),而其他类要使用此类时,不得不重复写以上大量的代码。
优点:最大的优点在于实现对象的创建和对象的使用分离,将复杂的对象创建交给专门的工厂类负责。
缺点:工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。
car抽象父类
public abstract class Car {
public void run(){};
}
子类:
public class BWM extends Car {
@Override
public void run() {
System.out.println("BMW");
}
}
public class GT extends Car{
@Override
public void run() {
System.out.println("ford GT");
}
}
工厂类:
public class Factory {
public static Car getCar(String type){
if ("BWM".equals(type)){
return new BWM();
}else if("GT".equals(type)){
return new GT();
}
return null;
}
}
客户类:
public class Client {
public static void main(String[] args) {
Car gt = Factory.getCar("GT");
gt.run();
}
}
工厂方法模式:
好处:创建具体产品实例的工作延迟到其工厂子类去完成,当系统需要新增一个产品是,无需修改现有系统代码,只需要添加一个具体产品类和其对应的工厂子类,使系统的扩展性变得很好,符合面向对象编程的开闭原则。
坏处:增加了编码难度,大量增加了类的数量,所以怎么选择还是看实际的需求。
工厂接口:
public interface Factory {
Car create();
}
车型工厂类:
public class GTFactory implements Factory{
@Override
public Car create() {
//★★★中间省略一万行代码
return new GT();
}
}
public class BWMFactory implements Factory {
@Override
public Car create() {
//★★★中间省略一万行代码
return new BWM();
}
}
car抽象父类:
public abstract class Car {
public void run(){};
}
具体car子类:
public class GT extends Car{
@Override
public void run() {
System.out.println("ford GT");
}
}
public class BWM extends Car{
@Override
public void run() {
System.out.println("bwm");
}
}
客户:
public class Client {
public static void main(String[] args) {
GTFactory gtFactory = new GTFactory();
Car gt = gtFactory.create();
gt.run();
}
}