5.创建型 - 抽象工厂模式 (Abstract Factory)

1.定义说明

  • 抽象工厂,顾名思义生产的产品是不确定的
  • 为创建一组对象提供一个接口,而不需要指定它们的具体类

2.UML类图

  • 角色介绍
    AbstractFactory : 抽象工厂
    ConcreteFactory1 : 具体工厂1
    ConcreteFactory2 : 具体工厂2
    AbstractProductA : 抽象产品A
    AbstractProductB : 抽象产品B
  • 要点
    抽象/具体工厂都是生产抽象产品

3.UML示例代码

/**
 * Copyright (C), 2016-2020
 * FileName: AbstractFactory
 * Author: wei.zheng
 * Date: 2019/12/5 21:25
 * Description: 抽象工厂类
 */
public abstract class AbstractFactory {
    public abstract IEngine createEngine();

    public abstract ITile createTile();
}
/**
 * Copyright (C), 2016-2020
 * FileName: BYDQinFactory
 * Author: wei.zheng
 * Date: 2019/12/5 21:27
 * Description: BYD 秦具体工厂类 :国产发动机、普通轮胎
 */
public class BYDQinFactory extends AbstractFactory {
    public BYDQinFactory() {
        Log.i("Factory", "BYD秦 工厂");
    }

    @Override
    public IEngine createEngine() {
        return new DomesticEngine();
    }

    @Override
    public ITile createTile() {
        return new NormalTile();
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: BYDTangFactory
 * Author: wei.zheng
 * Date: 2019/12/5 21:29
 * Description: BYD 唐具体工厂:进口发动机、赛车轮胎
 */
public class BYDTangFactory extends AbstractFactory {
    public BYDTangFactory() {
        Log.i("Factory", "BYD唐 工厂");
    }

    @Override
    public IEngine createEngine() {
        return new ImportEngine();
    }

    @Override
    public ITile createTile() {
        return new RacingTile();
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: IEngine
 * Author: wei.zheng
 * Date: 2019/12/5 21:22
 * Description: 发动机抽象产品接口
 */
public interface IEngine {
    void desc();
}

/**
 * Copyright (C), 2016-2020
 * FileName: DomesticEngine
 * Author: wei.zheng
 * Date: 2019/12/5 21:23
 * Description: 国产发动机具体产品类
 */
public class DomesticEngine implements IEngine {
    @Override
    public void desc() {
        Log.i("Engine", "国产发动机");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ImportEngine
 * Author: wei.zheng
 * Date: 2019/12/5 21:24
 * Description: 进口发动机具体产品类
 */
public class ImportEngine implements IEngine {
    @Override
    public void desc() {
        Log.i("Engine", "进口发动机");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ITile
 * Author: wei.zheng
 * Date: 2019/12/5 21:18
 * Description: 轮胎产品抽象接口
 */
public interface ITile {
    void desc();
}
/**
 * Copyright (C), 2016-2020
 * FileName: NormalTile
 * Author: wei.zheng
 * Date: 2019/12/5 21:19
 * Description: 普通轮胎具体产品
 */
public class NormalTile implements ITile {
    @Override
    public void desc() {
        Log.i("Tile", "普通轮胎");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: RacingTile
 * Author: wei.zheng
 * Date: 2019/12/5 21:21
 * Description: 赛车轮胎具体产品类
 */
public class RacingTile implements ITile {
    @Override
    public void desc() {
        Log.i("Tile", "赛车轮胎");
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // 使用示例
        AbstractFactory qinFactory = new BYDQinFactory();
        qinFactory.createEngine().desc();
        qinFactory.createTile().desc();

        AbstractFactory tangFactory = new BYDTangFactory();
        tangFactory.createEngine().desc();
        tangFactory.createTile().desc();
    }
}

4.总结

  • 优点与缺点
    优点:接口与实现分离,面向产品的接口编程,使其从具体的产品实现中解耦
    缺点:类文件繁多;扩展新的抽象产品类不方便,需要同步修改抽象工厂
  • 使用建议
    若工厂类较多,则会带来更多的类文件,实际开发中权衡使用
  • 工厂方法模式与抽象工厂模式比较
    前者:具体工厂生产具体产品
    后者:具体工厂生产抽象产品
发布了37 篇原创文章 · 获赞 0 · 访问量 580

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103413067