一、简单工厂
/** 简单工厂(静态工厂)* *//** 抽象产品类* */interface CarProduct{ /* * 抽象产品类的抽象方法show()。 * */ public void show();}/** 具体产品类* */class BigCarProduct implements CarProduct{ public void show(){ System.out.println("It is a BigCar"); } } /* * 具体工厂类 * */class CarFacory{ /* * 静态工厂方法。 * 实例化一个BigCarProduct对象。 * */ public static BigCarProduct createBigCar(){ return new BigCarProduct(); }}public class FactoryDP { public static void main(String[] args) { BigCarProduct bigcar = CarFacory.createBigCar(); bigcar.show(); }}/** output:* It is a BigCar* */
二、工厂方法
/** 工厂方法模式* *//** 抽象产品类* */interface CarProduct{ public void show();}/** 具体产品类* */class BigCarProduct implements CarProduct{ @Override public void show() { System.out.println("It is a BigCar"); }}/** 抽象工厂类* */interface CarFactory{ public CarProduct createCar();}/** 具体工厂类* */class BigCarFactory implements CarFactory{ @Override /* * 创建产品类方法 * */ public BigCarProduct createCar() { return new BigCarProduct(); }}public class FactoryDP { public static void main(String[] args) { BigCarFactory bigCarFactory = new BigCarFactory(); BigCarProduct bigCarProduct = bigCarFactory.createCar(); bigCarProduct.show(); }}/**output:*It is a BigCar*/
三、抽象工厂
/** 抽象工厂模式* *//** 抽象产品类* */interface CarProduct{ public void show();}/** 具体产品类* */class BigCarProduct implements CarProduct{ @Override public void show() { System.out.println("It is a BigCar"); }}class SmartCarProduct implements CarProduct{ @Override public void show() { System.out.println("It is a SmartCar"); }}/** 抽象工厂类* */interface CarFactory{ public CarProduct createBigCar(); public CarProduct createSmartCar();}/** 具体工厂类* */class CarBothFactory implements CarFactory{ /* * 创建产品类方法 * */ @Override public BigCarProduct createBigCar() { return new BigCarProduct(); } @Override public SmartCarProduct createSmartCar() { return new SmartCarProduct(); }}public class FactoryDP { public static void main(String[] args) { CarBothFactory carbothFactory = new CarBothFactory(); carbothFactory.createBigCar().show(); carbothFactory.createSmartCar().show(); }}/** output:* It is a BigCar*It is a SmartCar* */
四、总结
上面介绍了三种工厂设计模式,其实当你仔细思考他们的原理时其实都是同一个思想,即将产品的生产和产品的获取解耦。
在上面的三种工厂模式中,对于用户来说,不需要知道BigCar与SmartCar是如何进行创建并进行相应配置的,他们只需要获取一个这种Car的工厂,然后调用工厂里的生产方法,即可得到相应的产品。这就是将两者解耦了,也消除了显式的实例化操作。
而这三者又有何区别呢?
1.简单工厂是静态工厂,所以他的生产产品的方法是静态的,在Java面向对象的语法中他自然的丧失了一部分特性,即动态绑定等,因为它属于类而不是对象。
2.工厂方法和抽象工厂其实没什么区别,你从代码中就可以看到,不同之处就在于它将一个产品再度的进行了分类,而那个用来分类的标准的术语叫做产品族,这里的产品族就是Big和Smart,当一个产品需要以一个或多个产品族进行分类时,你写的工厂方法自然就变成了抽象工厂。