抽象工厂模式
2018-11-14 本文已影响0人
KingdomCoder
定义:
抽象工厂创建一系列
相关或者相互依赖
对象的接口。(无需指定具体的类,属于创建型)。
适应场景:
1.客户端或者应用层不依赖于产品类实例如何被创建、实现等细节。
2.强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码。
3.提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
优点:
1.具体产品在应用层代码隔离,无需关心创建细节。
2.将一系列的产品族统一到一起创建。
缺点:
1.规定了所有可能被创建的产品集合。产品族中扩展新的产品困难,需要修改抽象工厂的接口。
2.增加了系统的抽象性和系统难度。
产品等级接口和产品族:
产品等级接口和产品族产品等级接口和产品族
Coding:
抽象产品对象:
/**
* 抽象课程笔记
*/
public abstract class Article {
public abstract void produce();
}
/**
* 抽象课程视频
*/
public abstract class Video {
public abstract void produce();
}
具体系列产品实现:
/**
* JAVA笔记对象
*/
public class JavaArticle extends Article {
@Override
public void produce() {
System.out.println("Java Article ");
}
}
/**
* Python笔记对象
*/
public class PythonArticle extends Article {
@Override
public void produce() {
System.out.println("Python Article");
}
/**
* java 视频教程对象
*/
public class JavaVideo extends Video {
@Override
public void produce() {
System.out.println("Java Video ");
}
}
/**
* Python 视频教程对象
*/
public class PythonVideo extends Video{
@Override
public void produce() {
System.out.println("Python Video");
}
}
抽象产品族工厂:
/**
* CourseFactory 产品族工厂
* video+article 组成course(产品族)
*/
public interface CourseFactory {
Video getVideo();
Article getArticle();
}
具体产品族实现:
/**
* java的video+article 组成course(产品组)
*/
public class JavaCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Article getArticle() {
return new JavaArticle();
}
}
/**
* Python的video+article 组成course(产品组)
*/
public class PythonCourseFactory implements CourseFactory {
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Article getArticle() {
return new PythonArticle();
}
}
Test:
public class Test {
public static void main(String[] args) {
CourseFactory courseFactory = new JavaCourseFactory();
Video video = courseFactory.getVideo();
video.produce();
Article article = courseFactory.getArticle();
article.produce();
}
}
UML类图:
抽象工厂模式UML类图 微信公众号欢迎关注.jpg