设计模式——工厂方法模式总结

工厂方法模式

概述

与简单工厂的区别

工厂方法模式也是工厂模式的一种,对比简单工厂模式,他们之间的区别有以下几点:

  1. 简单工厂模式是根据参数的不同用 if 与 else 判断返回的产品,其工厂职责很重,可能一个工厂类中有高达几个个 if 。而工厂方法模式将工厂分离,具体实现工厂继承同一个抽象工厂,具体实现工厂生产不同的产品。
  2. 简单工厂模式如果要加入新的产品,那么必须修改工厂的逻辑,违背了“开闭原则”。而工厂方法模式则可以新建工厂或者产品,不用修改代码逻辑。

定义与使用场景

工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
主要解决:接口选择问题。

适用场景:

  1. 客户端不知道其需要的对象的类。
  2. 抽象工厂类通过其子类指定创建哪个对象。
  3. 通俗来说,就是明确计划不同条件创建不同实例。

工厂方法模式结构

工厂方法模式结构

  • Factory(抽象工厂类):声明了工厂方法,用于返回一个产品,所有创建对象的工厂类都需要实现该接口。
  • ConcreteFactory(具体工厂类):抽象工厂类的子类,实现了抽象工厂类中的返回具体产品类的方法。
  • Product(抽象产品类):定义产品的接口,用于传参与抽象。
  • ConcreteProduct(具体产品):具体产品类,具体工厂与具体产品一一对应。

实例

实例

结构

结构

/**
抽象工厂类
**/
public abstract class ImageReaderFactory {
    public abstract Image readImage();
}

/**
一个JPG读取工厂实现类
**/
public class GIFImageReaderFatory extends ImageReaderFactory{
    @Override
    public GIFImage readImage() {
        return new GIFImage();
    }
}

/**
一个GIF读取工厂实现类
**/
public class JPGImageReaderFactory extends ImageReaderFactory{
    @Override
    public Image readImage() {
        return new JPGImage();
    }
}

/**
抽象产品类
**/
public abstract class Image {
    public String getImageData() {
        return imageData;
    }

    public void setImageData(String imageData) {
        this.imageData = imageData;
    }

    public String imageData;
}

/**
一个具体产品类
**/
public class GIFImage extends Image{
    GIFImage(){
        this.imageData="gif";
    }
}

/**
一个具体产品类
**/
public class JPGImage extends Image{
    JPGImage(){
       this.imageData="jpg";
    }
}
/**
测试类
**/
public class Test {
    public static void main(String[] args) {
        ImageReaderFactory factory;
        Image image;
        factory=new GIFImageReaderFatory();
        System.out.println(factory.readImage().getImageData());
    }
}

结果:Result

具体使用场景

  1. 日志记录器
  2. 数据库访问:用户不知道系统采用哪一类数据库,以及数据库有可能变化。
  3. 设计一个连接服务器的框架,需要三个协议,“POP3”,“IMAP”,“HTTP”,使用一个共同的接口,三个作为具体产品类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值