/*
- 接口的应用:工厂模式
- 1工厂模式:实现了创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
- 用工厂方法代替 new 操作。将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
- 2工厂模式的分类:
- 2.1简单工厂模式:用来生产同一等级结构中的任意产品。
- 简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的实例对象。
- 调用者只要知道他要什么,从哪里拿,不需要知道如何创建,把调用者与创建者分离。
- 缺点:对于增加新产品,不修改代码的话,是无法扩展的。违反了开闭原则(对扩展开放;对修改封闭)
- 2.2工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
- 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立的模块而言)工厂类,
- 而工厂方法模式有一组实现了相同接口的工厂类.
- 2.3抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
- 抽象工厂模式和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。
- 抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象
- 3工厂模式应用的设计原则
- 3.1OCP(开闭原则,Open-Closed Principle)
- 一个软件的实体应当对扩展开放,对修改关闭。通过新增代码的方式来解决变化的需求,控制需求变动风险,缩小维护成本
- 3.2DIP(依赖倒转原则,Dependence Inversion Principle)
- 要针对接口编程,不要针对实现编程。面向抽象编程,解耦调用和被调用者。
- 如果 A 中关联 B,那么尽量使得 B 实现某个接口,然后 A 与接口发生关系,不与 B 实现类发生关联关系
- 3.3LOD(迪米特法则,Law Of Demeter)
- 要求尽量的封装,尽量的独立,尽量的使用低级别的访问修饰符。这是封装特性的典型体现
- 迪米特原则要求类之间的直接联系尽量的少,两个类的访问,通过中介类来实现
*/
package com.atguigu.contact;
public class Object_InterfaceFactory {
public static void main(String[] args) {
//无工厂模式直接造对象
AirPlane helicopter = new Helicopter();
AirPlane fighter = new Fighter();
helicopter.fly();
fighter.fly();
System.out.println("----------------");
//简单工厂模式,通过简单工厂类获取对象
AirPlaneFactory airPlaneFactory = new AirPlaneFactory();
AirPlane a = airPlaneFactory.getAirPlane("helicopter");
AirPlane b = airPlaneFactory.getAirPlane("fighter");
AirPlane c = airPlaneFactory.getAirPlane(null);//空指针,无法调取fly()方法
a.fly();
b.fly();
//c.fly();//空指针,无法调取fly()方法
System.out.println("----------------");
//工厂模式,通过专门的工厂类造对象
AirPlane d = new HelicopterFactory().getAirPlane();
AirPlane e = new FighterFactory().getAirPlane();
d.fly();
e.fly();
System.out.println("----------------");
}
}
interface AirPlane{
void fly();
}
class Helicopter implements AirPlane{
public void fly() {
System.out.println("直升机可以悬停");
}
}
class Fighter implements AirPlane {
public void fly() {
System.out.println("战斗机可以空战");
}
}
//简单工厂类
class AirPlaneFactory{
AirPlane getAirPlane(String s) {
if(s == "helicopter") {
return new Helicopter();
}else if(s == "fighter") {
return new Fighter();
}else {
return null;
}
}
}
//工厂接口
interface Factory{
public abstract AirPlane getAirPlane();
}
//单独的直升机工厂
class HelicopterFactory implements Factory{
@Override
public AirPlane getAirPlane() {
// TODO Auto-generated method stub
return new Helicopter();
}
}
//单独的战斗机工厂
class FighterFactory implements Factory{
@Override
public AirPlane getAirPlane() {
// TODO Auto-generated method stub
return new Fighter();
}
}