产品
- 产品族:可以类成品牌,如华为的手机,电脑,电视 --> 抽象工厂
- 产品等级:可以理解成功能,如华为的手机,小米的手机,苹果的手机 --> 工厂方法
- 定义:针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品。
- 工厂:为每个产品等级定义一个抽象工厂(抽象类/接口)
- 方法:一个具体工厂生产一个具体产品
- 适用场景
- 创建对象需要大量重复代码
- 客户端(应用层)不依赖于对象是如何创建,实现细节等
- 一个类通过其子类来指定创建那个对象
- 优点
- 用户只需要关心所需要的产品的工厂,无需关心创建细节
- 加入新产品符合开闭原则(只用扩展一个工厂即可),提高可扩展性
- 缺点
- 类的个数容易过多(一产品一工厂),增加复杂度
- 增加了系统的抽象性和理解难度
下面来看个代码示例…
1.创建抽象产品
public interface Vedio {
void play();
}
2.创建具体产品
// 产品1
public class JavaVedio implements Vedio {
@Override
public void play() {
System.out.println("java...");
}
}
// 产品2
public class GolangVedio implements Vedio {
@Override
public void play() {
System.out.println("golang...");
}
}
3.创建产品等级抽象工厂
// 定义Vedio等级的抽象工厂,一个具体工厂负责生产一个具体产品
public abstract class VedioFactory {
public abstract Vedio getVedio();
}
4.创建具体产品对应工厂
// 生产javaVedio的具体工厂
public class JavaVedioFactory extends VedioFactory {
@Override
public Vedio getVedio() {
return new JavaVedio();
}
}
// 生产golangVedio的具体工厂
public class GolangVedioFactory extends VedioFactory {
@Override
public Vedio getVedio() {
return new GolangVedio();
}
}
5.通过等级工厂创建对象
// 只依赖于具体工厂类,不用再import具体产品类
public class Test {
public static void main(String[] args) {
// 创建JavaVedio的工厂
VedioFactory factory1 = new JavaVedioFactory();
Vedio vedio1 = factory1.getVedio();
vedio1.play();
// 创建GOlangVedio的工厂
VedioFactory factory2 = new GolangVedioFactory();
Vedio vedio2 = factory2.getVedio();
vedio2.play();
}
}
6.产品扩展
- 扩展同类产品比较容易,如PHPVedio,只用再写一个具体工厂即可
- 但若要扩展另一类,如Article,就要重写一个抽象工厂,易出现类爆炸情况
// 新的具体产品类
public class PHPVedio implements Vedio {
@Override
public void play() {
System.out.println("PHP...");
}
}
// 该产品类对应的工厂类
public class PHPVedioFactory extends VedioFactory {
@Override
public Vedio getVedio() {
return new PHPVedio();
}
}
总结对比
三种工厂模式使用要视情况而定,假如写个hello world 完全没有必要使用抽象工厂模式,使用工厂模式的根本目的是为了降低程序的耦合性从而应对客户需求的变化。
本文标题:【设计模式】创建型:工厂模式(三)工厂方法
本文链接:https://blog.quwenai.cn/post/10173.html
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。







还没有评论,来说两句吧...