目录
-
定义
-
类型
-
优点
-
缺点
-
实现方式
-
定义
-
类型
-
优点
-
缺点
-
实现方式
-
源码
-
`List`的`iterator`方法
-
定义
-
产品等级和产品族
-
类型
-
优点
-
缺点
-
实现方式
简单工厂
定义
由工厂角色决定生成何种产品。
简单工厂有三个角色:
-
工厂角色,负责根据参数生成不同的类 -
抽象产品角色:产品的行为定义 -
具体产品角色:产品实例,实现了抽象产品角色定义的行为
图示:

类型
创建型
优点
传入参数就可获得对象,封装创建细节
缺点
增加新生成对象时需要修改工厂类的逻辑
实现方式
通过参数判断创建不同类并返回,也可以通过传入类名用反射创建。
public Weapon create(String name) {
if ("sword".equals(name)) {
return new SwordWeapon();
} else if ("gun".equals(name)) {
return new GunWeapon();
}
}
工厂方法
定义
定义一个创建对象的接口,让实现类来决定创建哪个类的对象。
类型
创建型
优点
-
只需要关心所需产品对应的工厂,不需要关心创建细节 -
加入新产品符合开闭原则,提高可扩展性
缺点
-
类的个数容易过多,增加复杂度 -
增加了系统的抽象性和理解难度
实现方式
定义一个武器基类:
public abstract class Weapon {
public abstract void fire();
}
创建两种武器,枪和火箭:
public class Gun extends Weapon{
@Override
public void fire() {
System.out.println("哒哒哒");
}
}
public class Missile extends Weapon{
@Override
public void fire() {
System.out.println("321发射");
}
}
定义一个接口用于获取武器:
public interface WeaponFactory {
Weapon getWeapon();
}
定义两种武器的工厂实现获取武器的接口:
public class GunFactory implements WeaponFactory{
@Override
public Weapon getWeapon() {
return new Gun();
}
}
public class MissileFactory implements WeaponFactory{
@Override
public Weapon getWeapon() {
return new Missile();
}
}
客户端:
public class Main {
public static void main(String[] args) {
WeaponFactory weaponFactory = new GunFactory();
Weapon weapon = weaponFactory.getWeapon();
weapon.fire();
}
}
通过获得不同武器的工厂来获取不同种类的武器,扩展方便,如果需要增加新的武器,只需要增加新的武器工厂类即可。
源码
List
的iterator
方法
/**
* Returns an iterator over the elements in this list in proper sequence.
*
* @return an iterator over the elements in this list in proper sequence
*/
Iterator<E> iterator();
抽象工厂
定义
抽象工厂提供一个创建一系列相关或相互依赖对象的接口。
产品等级和产品族

每一个行是一个产品族,每一个列是一个产品等级,一个具体工厂可以创建一个产品组的产品。
类型
创建型
优点
-
具体产品应用层代码隔离 -
将一个系列的产品族统一创建
缺点
-
规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
实现方式
定义两个产品抽象类:
public abstract class Video {
public abstract void showContent();
}
public abstract class Ppt {
public abstract void showContent();
}
public class JavaVideo extends Video{
@Override
public void showContent() {
System.out.println("Java视频内容");
}
}
public class JavaPpt extends Ppt{
@Override
public void showContent() {
System.out.println("Java ppt 内容");
}
}
public class PythonVideo extends Video{
@Override
public void showContent() {
System.out.println("Python 视频内容");
}
}
public class PythonPpt extends Ppt{
@Override
public void showContent() {
System.out.println("Python ppt 内容");
}
}
定义产品族课程工厂接口:
public interface CourseFactory {
Video getVideo();
Ppt getPpt();
}
实现生成具体课程的工厂类:
/**
* Java 课程产品族工厂
*/
public class JavaCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new JavaVideo();
}
@Override
public Ppt getPpt() {
return new JavaPpt();
}
}
/**
* Python 课程产品族工厂
*/
public class PythonCourseFactory implements CourseFactory{
@Override
public Video getVideo() {
return new PythonVideo();
}
@Override
public Ppt getPpt() {
return new PythonPpt();
}
}
测试类:
public class Main {
public static void main(String[] args) {
CourseFactory courseFactory = new JavaCourseFactory();
courseFactory.getVideo().showContent();
courseFactory.getPpt().showContent();
}
}
UML:

参考资料
-
imooc-Java设计模式精讲-Debug方式+内存分析,真正学懂设计模式 -
Java Design Patterns
原文始发于微信公众号(erpang coding):设计模式-工厂
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/37366.html