文章目录
- 1、抽象工厂模式介绍
- 2、抽象工厂模式的定义
- 3、抽象工厂模式的使用场景
- 4、抽象工厂模式的简单实现
- 5、小结
1、抽象工厂模式介绍
抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现。
2、抽象工厂模式的定义
为创建一组相关或者相互依赖的对象提供接口,而不需要具体指定他们的具体类。
3、抽象工厂模式的使用场景
一个对象有相同的约束时可以使用抽象工厂模式。
4、抽象工厂模式的简单实现
以车厂为例,Q3, Q5, Q7, 虽然是一个车系,但是两者之间的零部件差别很大,
1)Q3 发动机 国产 ; Q7 发动机 原装进口
2)Q3 轮胎 普通轮胎 ; Q7 越野轮胎
3) Q3 比较普通的制动系统 ; Q7 制动性极好的制动系统
Q3 Q7 虽然是 同一种的产品类型,但是发动机 轮胎 制动性 都不一样,
这时候就使用到了抽象工厂模式,首先工厂需要生产 轮胎 、 发动机 、 制动系统 这三部分组件。
代码架构 :
- 先建立一个抽象车厂类 CarFactory
(1)先创建 一个 汽车工厂类,用来生产同型号的汽车,说白了 就是 Q3 Q5 Q7 各自继承
(2)由于是同类型的车但是 里面的零件会不同,所以我们把类里添加 不同的 零件对象 类
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
//创建一个汽车工厂 抽象一个汽车工厂类
public abstract class CarFactory {
//生产轮胎
public abstract ITire createTire(); //返回 轮胎对象
//生产发动机
public abstract IEngin createEngine(); //返回 发动机对象
//生产制动系统
public abstract IBrake createBrake(); //返回 制动系统 对象
}
这里我们为每一个零件定义一个接口,并分别创建两个不同的实现类表示不同的零部件产品
5) 轮胎接口 以及 相关类
(1) 轮胎接口
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public interface ITire {
//轮胎接口
void tire();
}
(2)普通轮胎类
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class NormalTire implements ITire {
@Override
public void tire() {
System.out.println("普通轮胎");
}
}
(3)越野轮胎类
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class SUVTire implements ITire {
@Override
public void tire() {
System.out.println("越野轮胎");
}
}
6)发动机接口 以及相关类
(1)发动机 接口
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public interface IEngin {
//发动机
void engine();
}
(2)国产发动机 类
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class DomesticEngin implements IEngin {
@Override
public void engine() {
System.out.println("国产发动机");
}
}
(3)进口发动机类
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class ImportEngin implements IEngin {
@Override
public void engine() {
System.out.println("进口发动机");
}
}
7)制动系统接口 以及 相关类
(1)制动系统接口
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public interface IBrake {
//制动系统
void brake();
}
(2)普通的制动系统
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class NormalBrake implements IBrake {
@Override
public void brake() {
System.out.println("普通制动");
}
}
(3)高级的制动系统
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
public class SeniorBrake implements IBrake {
@Override
public void brake() {
System.out.println("高级制动");
}
}
8)具体的 不同的生产 车厂 Q3 生产厂
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
//对于 Q3工厂 使用其他的 零部件不同
public class Q3Factory extends CarFactory {
@Override
public ITire createTire() {
return new NormalTire(); //返回普通的轮胎类
}
@Override
public IEngin createEngine() {
return new DomesticEngin(); //返回国产发动机
}
@Override
public IBrake createBrake() {
return new NormalBrake(); //返回一般制动
}
}
9)具体的 不同的生产 车厂 Q7 生产厂
package com.example.lum.abstortefactory;
/**
* Created by lum on 2018/10/13.
*/
// Q7 车生产类
public class Q7Factory extends CarFactory {
@Override
public ITire createTire() {
return new SUVTire(); //返回SUV 车胎
}
@Override
public IEngin createEngine() {
return new ImportEngin(); //返回进口轮胎
}
@Override
public IBrake createBrake() {
return new SeniorBrake(); //返回高级制动
}
}
10) 客户类 具体的实例化调用 生产
package com.example.lum.abstortefactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//构造一个生产Q3 的工厂
CarFactory factoryQ3 = new Q3Factory();
factoryQ3.createTire().tire();
factoryQ3.createEngine().engine();
factoryQ3.createBrake().brake();
//构造一个 生产Q7 的 工厂
CarFactory factoryQ7 = new Q7Factory();
factoryQ7.createTire().tire();
factoryQ7.createEngine().engine();
factoryQ7.createBrake().brake();
}
}
最后运行的结果显示:
可以看出 Q3 Q7 使用的是不同的 零件组装。
5、小结
1)适用于相同 类型 内部不同方法时 使用
2)不容易扩展
文献参考:
Android 源码设计模式解析与实战 第二版
本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。