设计模式-工厂

目录


  • 定义

  • 类型

  • 优点

  • 缺点

  • 实现方式

  • 定义

  • 类型

  • 优点

  • 缺点

  • 实现方式

  • 源码

    • `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();
    }
}

通过获得不同武器的工厂来获取不同种类的武器,扩展方便,如果需要增加新的武器,只需要增加新的武器工厂类即可。

源码

Listiterator方法

    /**
     * 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();
}

定义JavaPython产品类:

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

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!