设计模式学习(一)工厂模式

目录

1.简单工厂模式(静态工厂方法模式)

2.简单工厂升级版:

3.工厂方法模式

4.抽象工厂模式


1.简单工厂模式(静态工厂方法模式)

定义

简单工厂模式(Simple Factory Pattern)是指一个工厂对象决定创建出哪一种产品类的实例,但它并不属于GOF23种设计模式。

应用场景:

适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

UML类结构图:

代码实现:

ICourse接口

public interface ICourse {
    void study();
}

JavaCourse类

public class JavaCourse implements ICourse {
    @Override
    public void study() {
        System.out.println("学习Java课程");
    }
}

PythonCourse类

public class PythonCourse implements ICourse {
    @Override
    public void study() {
        System.out.println("学习Python 课程");
    }
}

CourseFactory类

public class CourseFactory {
    public static ICourse create(String name) {
        if ("java".equals(name)) {
            return new JavaCourse();
        } else if ("python".equals(name)) {
            return new PythonCourse();
        } else {
            return null;
        }
    }
}

测试类

public class SimpleFactoryTest {
    public static void main(String[] args) {
        ICourse create = CourseFactory.create("Java");
        create.study();
    }
}

输出结果:

学习Java课程

2.简单工厂升级版:

UML类结构图:

代码实现:

public class CourseFactory {
    public static ICourse create(Class<JavaCourse> clazz) {
        try {
            if (clazz != null) {
                return clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

升级点:

1.如果要新增HtmlCourse需要修改CourseFactory的代码,不符合开闭原则(对扩展开放,对修改关闭);
2.方法参数是字符串,可控性有待提升;

3.工厂方法模式

定义:

工厂方法模式(Factory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。

应用场景:

1、创建对象需要大量重复的代码;
2、客户端(应用层)不依赖于产品类实例如何被创建、实现等细节;
3、一个类通过其子类来指定创建哪个对象。

UML类结构图:

代码实现:

ICourse接口

public interface ICourse {
    void study();
}

JavaCourse类

public class JavaCourse implements ICourse {
    @Override
    public void study() {
        System.out.println("学习Java课程");
    }
}

PythonCourse类

public class PythonCourse implements ICourse {
    @Override
    public void study() {
        System.out.println("学习Python课程");
    }
}

ICourseFactory接口

public interface ICourseFactory {
    ICourse create();
}

JavaICourseFactory类

public class JavaICourseFactory implements ICourseFactory {
    @Override
    public ICourse create() {
        return new JavaCourse();
    }
}

PythonICourseFactory类

public class PythonICourseFactory implements ICourseFactory {
    @Override
    public ICourse create() {
        return new PythonCourse();
    }
}

测试代码:

public class FactoryTest {
    public static void main(String[] args) {
        ICourseFactory factory = new JavaICourseFactory();
        ICourse course = factory.create();
        course.study();

        factory = new PythonICourseFactory();
        course = factory.create();
        course.study();
    }
}

输出结果:

学习Java课程
学习Python课程

缺点:

1、类的个数容易过多,增加复杂度;
2、增加了系统的抽象性和理解难度。

4.抽象工厂模式

定义:

抽象工厂模式(Abstract Factory Pattern)是指提供一个创建一系列相关或者相互依赖对象的接口,无须指定他们具体的类。

适用场景:

当需要创建的对象是一系列相互关联或相互依赖的产品族时,便可以使用抽象工厂模式。说的更明白一点,就是一个继承体系中,如果存在着多个等级结构(即存在着多个抽象类),并且分属各个等级结构中的实现类之间存在着一定的关联或者约束,就可以使用抽象工厂模式。假如各个等级结构中的实现类之间不存在关联或约束,则使用多个独立的工厂来对产品进行创建,则更合适一点。

缺点:

1、规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂 的接口。 (不符合开闭原则)
2、增加了系统的抽象性和理解难度。

产品族 相当于  品牌(例如:Java,Python)

产品等级  相当于  产品类型(例如:课程视频,课程笔记)

UML类结构图:

代码实现:

INote接口

public interface INote {
    void edit();
}

IVideo接口

public interface IVideo {
    void record();
}

JavaNote类

public class JavaNote implements INote {
    @Override
    public void edit() {
        System.out.println("编写Java笔记");
    }
}

JavaVideo类

public class JavaVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("录制Java视频");
    }
}

PythonNote类

public class PythonNote implements INote {
    @Override
    public void edit() {
        System.out.println("编写Python笔记");
    }
}

PythonVideo类

public class PythonVideo implements IVideo {
    @Override
    public void record() {
        System.out.println("录制Python视频");
    }
}

ICourseFactory接口

public interface ICourseFactory {
    INote createNote();
    IVideo createVideo();
}

JavaCourseFactory类

public class JavaCourseFactory implements ICourseFactory {
    @Override
    public INote createNote() {
        return new JavaNote();
    }

    @Override
    public IVideo createVideo() {
        return new JavaVideo();
    }
}

PythonCourseFactory类

public class PythonCourseFactory implements ICourseFactory {
    @Override
    public INote createNote() {
        return new PythonNote();
    }

    @Override
    public IVideo createVideo() {
        return new PythonVideo();
    }
}

测试代码:

public class AbstractFactoryTest {
    public static void main(String[] args) {
        CourseFactory factory = new JavaCourseFactory();
//        CourseFactory factory = new PythonCourseFactory();
        INote note = factory.createNote();
        IVideo video = factory.createVideo();
        note.edit();
        video.record();
    }
}

输出结果:

编写Java笔记
录制Java视频

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值