设计模式学习笔记---------------------------------------------工厂模式和匿名类

     实现原理:利用多态的特性,将定义和实现彻底分开。

     应用场景:对于某一群拥有公共接口的类,只用知道类名,就可以得到该类的实例对象。这对于一些复杂的对象,直接通过new创建会比较复杂,而且对于使用者来说没有必要,还有就是如果修改了创建对象时的参数,使用该类的方法都要进行修改。为此将对象的定义和实现分开,符合软件设计的开闭原则,对扩展开放,对修改关闭。

       举例 马路上跑着不同的车

       所有的车都有跑这个功能,可以抽象出一个车的接口

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/27 19:09
 * @Description:
 */
public interface Car {
    void run();
}

  注意为了把接口和实现分开,我们把车的具体实现和定义分开,抽象出一个专门建造车的工厂接口。

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/27 19:11
 * @Description:
 */
public interface CarFactory {
    Car getCar();
}

马路上可以跑各种各样的车,

有宝马车

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:45
 * @Description:
 */
public class BMWCar implements Car {
    private BMWCar(){};
    public static CarFactory factory = new CarFactory() {
        public Car getCar() {
            return new BMWCar();
        }
    };
    public void run() {
        System.out.println("BMW car is running");
    }
}

有奔驰车

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:50
 * @Description:
 */
public class BenZCar implements Car {
    private BenZCar(){};
    public void run() {
        System.out.println("BenZCar is running");
    }
    public static CarFactory Factory = new CarFactory() {
        public Car getCar() {
            return new BenZCar();
        }
    };
}

让不同的车跑起来

package com.ggp.demo;

/**
 * @author: ggp
 * @Date: 2019/9/29 10:52
 * @Description:
 */
public class Run {
    public static void run(CarFactory factory){
        factory.getCar().run();
    }

    public static void main(String[] args) {
        run(BMWCar.factory);
        run(BenZCar.Factory);
    }
}

为什么要用匿名类。

没有必要去使用具名类,这样更加优雅方便,而且把工厂方法内置到被创建的类中,同样利用了工厂模式的思想,创建工厂对象的定义和实现都不对外暴露,提高内聚。这一点是参考《JAVA编程思想》中的例子。

参考资料:《JAVA编程思想》

你可能感兴趣的:(设计模式)