谈谈几种工厂模式
简单工厂模式
假设我们有一个造车厂,可以制造各种车。
- Car接口
public interface Car{//通用的产品接口
void show();
}
-
具体的car车类型
public class QQCar implements Car{ public void show(){ System.out.println("QQ系列Car"); } }
public class BYDCar implements Car{ public void show(){ System.out.println("BYD系列Car"); } }
-
factory简单工厂
public class CarFactory{//示例代码,非实际开发 public Car createCar(String type){ if (/*获取创造具体产品类型*/.equals("QQ")) { return new QQCar(); } else if (/*获取创造具体产品类型*/.equals("BYD")) { return new BYDCar(); } return null; } }
-
工厂方法模式
由父类提供一个创建对象的方法,允许子类决定实例化对象的类型,换言之就是让类的实例化推迟到子类去完成
- 工厂(基础创建者)
public abstract class CreateCarFactory{//选用抽象类或者接口视情况而定
public abstract Car createCar();
.....//other code
}
-
具体工厂(具体创建者)
public class QQCarFactory extends CreateCarFactory{ @Override public Car createCar() { return new QQCar(); } }
public class BYDCarFactory extends CreateCarFactory{ @Override public Car createCar() { return new BYDCar(); } }
-
执行代码
public class Demo { private static CreateCarFactory carfactory; //示例代码,非实际开发 static void selectFactory() { if (/*获取创造具体产品类型*/.equals("QQ")) { carfactory = new QQCarFactory(); } else if (/*获取创造具体产品类型*/.equals("BYD")) { carfactory = new BYDCarFactory(); } } }
优点:
- 避免客户端代码与具体产品代码出现耦合
- 符合单一职责原则、开闭原则,使得代码易维护,易扩展
缺点:
- 代码结构变得更复杂
抽象工厂模式
用于提供一个创建一系列相关或互相依赖对象的接口,产品族系多于一个。
即直接在抽象的接口增加方法。
如在车厂还可以生成车载电脑,QQ生产使用qq系统PC,BYD生产使用byd系统pc
-
PC接口
public interface PC { void show(); }
public class QQPc implements PC{ public void show(){ System.out.println("qq系统PC"); } }
public class BYDPc implements PC{ public void show(){ System.out.println("byd系统PC"); } }
-
工厂
public abstract class CreateCarFactory{//选用抽象类或者接口视情况而定 public abstract Car createCar(); public abstract PC createPC(); .....//other code }
- 具体工厂(BYD工厂)
public class BYDCarFactory extends CreateCarFactory{ @Override public Car createCar() { return new BYDCar(); } @Override public PC createPC() { return new BYDPc(); } }
- 执行代码
public class Demo { private static CreateCarFactory carfactory; //示例代码,非实际开发 static void selectFactory() { if (/*获取创造具体产品类型*/.equals("QQ")) { carfactory = new QQCarFactory(); } else if (/*获取创造具体产品类型*/.equals("BYD")) { carfactory = new BYDCarFactory(); } } }
优点:
- 确保了同一工厂生产的产品相互匹配
- 同 -- 工厂方法具备的优点。
缺点:同 -- 工厂方法具备的缺点