- 工厂模式(Factory Pattern)提供了一种创建对象的最佳方式。我们不必关心对象的创建细节,只需要根据不同情况获取不同产品即可。难点:写好我们的工厂

简单工厂模式(Simple Factory)
三个角色
- Factory:工厂角色,
- WuLinFactory Product:抽象产品角色,
- Car ConcreteProduct:具体产品角色, VanCar、MiniCar
缺点:违背开闭原则,每次新增产品都需要修改代码逻辑
代码实现
//抽象产品角色public abstract class Car {abstract void run();}
//产品具体的实现@Datapublic class MiniCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("MiniCar");}}
//产品的具体实现@Datapublic class VanCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("VanCar");}}
//工厂角色public class WuLinFactory {public static Car newCar(String car) {if ("MiniCar".equals(car)) {return new MiniCar();}if ("VanCar".equals(car)) {return new VanCar();}return null;}}
//测试类public class CarTest {public static void main(String[] args) {Car miniCar = WuLinFactory.newCar("MiniCar");Car vanCar = WuLinFactory.newCar("VanCar");miniCar.run();vanCar.run();}}
工厂(Factory)模式-工厂方法(Factory Method)
四个角色
- Product:抽象产品
- ConcreteProduct:具体产品
- Factory:抽象工厂
- ConcreteFactory:具体工厂
缺点:系统复杂度增加,产品单一
代码实现
//抽象产品角色public abstract class Car {abstract void run();}
//产品具体的实现@Datapublic class MiniCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("MiniCar");}}
//产品的具体实现@Datapublic class VanCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("VanCar");}}
//工厂具体实现public class WulinMiniFactory extends WulinFactory{@Overridepublic Car newCar() {return new MiniCar();}}
//工厂具体实现public class WulinVanFactory extends WulinFactory{@Overridepublic Car newCar() {return new VanCar();}}
//抽象工厂public abstract class WulinFactory {public abstract Car newCar();}
//测试public class CarTest {public static void main(String[] args) {WulinFactory wulinVanFactory = new WulinVanFactory();WulinFactory wulinMiniFactory = new WulinMiniFactory();Car car = wulinVanFactory.newCar();Car car1 = wulinMiniFactory.newCar();car.run();car1.run();}}
工厂(Factory)模式-抽象工厂(Abstract Factory)

与工厂方法模式的区别,顶级工厂抽象有所有创建工厂方法,子工厂按需实现
如何实现,人民需要什么,五菱就造什么
代码实现
//Car 顶层抽象public abstract class Car {public abstract void run();}
//N 顶层抽象public abstract class N {public abstract void run();}
@Datapublic class MiniCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("MiniCar");}}
@Datapublic class VanCar extends Car{private String name;private String age;@Overridevoid run() {System.out.println("VanCar");}}
public class N95 extends N{@Overridepublic void run() {System.out.println("N95");}}
public class N99 extends N{@Overridepublic void run() {System.out.println("N99");}}
/*** 定义总厂规范**/public abstract class WulinFactory {public abstract Car newCar();public abstract N newN();}
public class WulinMiniFactory extends WulinFactory{@Overridepublic Car newCar() {return new MiniCar();}@Overridepublic N newN() {return null;}}
public class WulinVanFactory extends WulinFactory{@Overridepublic Car newCar() {return new VanCar();}@Overridepublic N newN() {return null;}}
public class WulinN95Factory extends WulinFactory{@Overridepublic Car newCar() {return null;}@Overridepublic N newN() {return new N95();}}
public class WulinN99Factory extends WulinFactory{@Overridepublic Car newCar() {return null;}@Overridepublic N newN() {return new N99();}}
工厂模式的退化
当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式。
什么场景用到?
- NumberFormat、SimpleDateFormat
- LoggerFactory:
- SqlSessionFactory:MyBatis
- BeanFactory:Spring的BeanFactory(就是为了造出bean)
- ……
