设计模式学习:工厂方法模式

本文介绍了工厂方法模式,这是一种创建型设计模式,旨在通过工厂子类决定实例化哪个具体产品类。文章详细阐述了模式的结构,包括抽象工厂、具体工厂、抽象产品和具体产品的角色,并给出一个示例代码展示其工作原理。此外,讨论了模式的优点,如封装创建细节、增加系统扩展性,以及缺点,如添加新产品会增加复杂度。

一、工厂方法模式定义
工厂方法模式又称为工厂模式,也叫虚拟构造器模式或者多态工厂模式,它属于创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
二、 工厂方法的模式结构
(1) 抽象工厂(Factory)角色:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。
(2)具体工厂(ConcreteCreator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。
(3)抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。
(4)具体产品(ConcreteProduct)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应

结构图:

工厂模式的优点:
(1)使用工厂方法来创建用户所需的产品,用户只要关心所需产品对应的工厂,无需关心创建的细节。
(2)所有的具体工厂类都具有同一抽象父类(本例中的CarFactory作为BMWFactory和BenzFactory 的父类)工厂能自行确定创建何种产品对象,而创建的细节完全封装在具体工厂中。
(3)如果新加入产品,就无需修改抽象工厂类和抽象产品类,也无需修改其他具体工厂和产品,而只用添加一个具体工厂和具体产品即可。增加系统的可扩展性,符合开闭原则

缺点:
添加新产品会增加具体工厂类和具体产品类,这无疑会增加系统的复杂度,带来更多的开销。

demo:

public class Leifeng {

    public void Sweep() {
        System.out.println("扫地");
    }

    public void Wash() {
        System.out.println("洗衣");
    }

    public void BuyRice() {
        System.out.println("买米");
    }
}
public class Volunteer extends Leifeng{
    @Override
    public void Sweep() {
        System.out.println("Volunteer Sweep");
    }

    @Override
    public void Wash() {
        System.out.println("Volunteer Wash");
    }

    @Override
    public void BuyRice() {
        System.out.println("Volunteer BuyRice");
    }
}
public class Undergraduate extends Leifeng{
}
public interface IFactory {
    Leifeng CreateLeifeng();
}
public class CreateUndergraduateFactory implements IFactory{

    @Override
    public Leifeng CreateLeifeng() {
        return new Undergraduate();
    }
}
public class CreateVolunteerFactory implements IFactory{

    @Override
    public Leifeng CreateLeifeng() {
        return new Volunteer();
    }
}
public class Main {
    public static void main(String[] args) {
        IFactory undergraduateFactory = new CreateUndergraduateFactory();
        Leifeng student = undergraduateFactory.CreateLeifeng();
        student.BuyRice();
        student.Sweep();
        student.Wash();

        IFactory volunteerFactory = new CreateVolunteerFactory();
        Leifeng volunteer = volunteerFactory.CreateLeifeng();
        volunteer.Wash();
        volunteer.Sweep();
        volunteer.BuyRice();
    }
}

学习了一周的设计模式感觉自己并没有充分掌握它们的使用,u所以打算先把之前学习的几个常用模式熟练掌握之后再学习其他的模式,so,设计模式的学习暂时先到此~(ps:后续还需学习观察者模式,原型模式,建造者模式!!!)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值