作用
- 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
何时使用
- 我们明确地计划不同条件下创建不同实例时
优点
- 一个调用者想创建一个对象,只要知道其名称就可以了
- 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以
- 屏蔽产品的具体实现,调用者只关心产品的接口
实例
- 简单工厂
package xin.chen.create_type.factory.simpleFactory; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:50 * @Version: * @Acton: 行为借口 */ public interface Car { void run(); }
package xin.chen.create_type.factory.simpleFactory; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 10:06 * @Version: * @Acton: */ public class CarFactory { /** 第一种模式*/ public static Car createCar(String type){ if("byd".equals(type)){ return new Byd(); }else if("gq".equals(type)){ return new Gq(); } return null; } /** 第二种模式 */ public static Car createByd(){ return new Byd(); } public static Car createGq(){ return new Gq(); } }
package xin.chen.create_type.factory.simpleFactory; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:50 * @Version: * @Acton: */ public class Byd implements Car { @Override public void run() { System.out.println("Byd 起飞"); } }
package xin.chen.create_type.factory.simpleFactory; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:51 * @Version: * @Acton: */ public class Gq implements Car { @Override public void run() { System.out.println("Gq 起飞"); } }
关系图:package xin.chen.create_type.factory.simpleFactory; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:52 * @Version: * @Acton: 测试简单工厂 */ public class TestSimpleFactoryDemo { public static void main(String[] args){ //没用工厂之前 // Car car1 = new Gq(); // Car car2 = new Byd(); // car1.run(); // car2.run(); //用简单工厂之后 Car byd = CarFactory.createCar("byd"); Car gq = CarFactory.createCar("gq"); byd.run(); gq.run(); Car byd1 = CarFactory.createByd(); Car gq1 = CarFactory.createGq(); byd.run(); gq.run(); } }
- 工厂方法
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:50 * @Version: * @Acton: 行为借口 */ public interface Car { void run(); }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 10:33 * @Version: * @Acton: 行为工厂 */ public interface CarFactory { Car createCar(); }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:50 * @Version: * @Acton: */ public class Byd implements Car { @Override public void run() { System.out.println("Byd 起飞"); } }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 10:34 * @Version: * @Acton: */ public class BydFactory implements CarFactory { @Override public Car createCar() { return new Byd(); } }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 9:51 * @Version: * @Acton: */ public class Gq implements Car { @Override public void run() { System.out.println("Gq 起飞"); } }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 10:35 * @Version: * @Acton: */ public class GqFactory implements CarFactory { @Override public Car createCar() { return new Gq(); } }
package xin.chen.create_type.factory.factoryMethod; /** * @Author: create_By: chenxin * @Data:Created in 2018/8/3 10:35 * @Version: * @Acton: 测试工厂方法 */ public class TestFactoryMethodDemo { public static void main(String[] args){ Car car = new BydFactory().createCar(); Car car1 = new GqFactory().createCar(); car.run(); car1.run(); } }
关系图: