Factory(工厂模式)
工厂模式实现了创建者和调用者的分离
工厂模式分类:
1.简单工厂模式
2.工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类
3.抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1、简单工厂模式:虽然能通过工厂来创建对象,但是违反了开闭原则。一旦增加功能需要在原有基础上修改代码。
使用了简单工厂模式后:可以创建一个工厂类,该类中提供一个创建汽车的工厂(方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | //汽车工厂 public class CarFactory { /** * 创建汽车 * @param type * @return */ public static Car createCar(String type){ //该方法还会有问题,假如以后有很多汽车都需要工厂来创建。则又得修改源代码,违反了OCP开闭原则 if ( "audi" .equals(type)) { return new Audi(); } else if ( "byd" .equals(type)) { return new Byd(); } else { return null ; } } } //测试简单工厂方法 public class TestSimpleFactoryCar { //调用者 public static void main(String[] args) { //创建汽车 Car audi = CarFactory.createCar( "audi" ); //创建者 Car byd = CarFactory.createCar( "byd" ); audi.run(); byd.run(); } } |
2、工厂方法模式:将工厂类调整为工厂接口,需要什么类型的工厂就使用该类实现该工厂,创建相应的产品。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //工厂接口 public interface CarFactory { //创建汽车方法 Car createCar(); } //创建比亚迪汽车的工厂 public class BydFactory implements CarFactory{ @Override public Car createCar() { return new Byd(); } } //创建奥迪的工厂 public class AudiFactory implements CarFactory { @Override public Car createCar() { return new Audi(); } } //测试工厂方法 public class TestFactoryMethod { public static void main(String[] args) { /** * 工厂方法模式好处在于,以后如果再增加一辆车。只需再实现CarFactory接口即可。避免了OCP开闭原则 * 不用在原来的代码上修改,只需新增类即可。 * 例如:增加一辆奔驰,增加一个奔驰工厂BenzFactory即可。更好扩展 */ Car audi = new AudiFactory().createCar(); Car byd = new BydFactory().createCar(); audi.run(); byd.run(); } } |