工厂模式:简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式适合凡是出现大量对象需要创建,而且这些对象拥有相同的接口,可以使用工厂模式进行创建。

简单工厂模式
简单工厂模式分为三种:普通工厂模式、多个方法工厂模式、静态方法工厂模式


以发送QQ消息或者微信消息为例来说明:
普通工厂模式

/**
 * 两种共同的接口
 */
public interface Message {
    public void send();
}
//QQ消息
public class QQMessage implements Message {
    @Override
    public void send() {
        System.out.println("发送QQ消息");
    }
}
//微信消息
public class WeiXinMessage implements Message {
    @Override
    public void send() {
        System.out.println("发送微信消息");
    }
}
//消息发送工厂类
public class MessageFactory {
    public Message sendMessage(String type){
        if("QQ".equals(type)){
            return new QQMessage();
        }
        else if("WeiXin".equals(type)){
            return new WeiXinMessage();
        }else{
            return null;
        }
    }
}
//消息发送测试
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new MessageFactory();
        Message message=messageFactory.sendMessage("QQ");
        message.send();
    }
}

这里写图片描述


多个方法工厂模式
在普通工厂中,如果传递的字符串和工厂中预定的不一致,则不能正确的创建对象。
对工厂类改进如下:

//消息发送工厂类
public class MessageFactory {
   public Message sendQQ(){
        return new QQMessage();
    }
    public Message sendWeiXin(){
        return new WeiXinMessage();
    }
}
//消息发送测试
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new MessageFactory();
        Message message=messageFactory.sendWeiXin();
        message.send();
    }
}

这里写图片描述


静态方法工厂模式
在多个方法中,还需要创建一个工厂对象才可以调用其方法,可以吧工程类中的方法设置为静态的。
对工厂类改进如下:

//消息发送工厂类
public class MessageFactory {
   public static Message sendQQ(){
        return new QQMessage();
    }
    public static Message sendWeiXin(){
        return new WeiXinMessage();
    }
}
//消息发送测试
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory.sendWeiXin().send();
    }
}

工厂方法模式(Factory Method)
对上面的简单工厂模式进行分析易知:类的创建依赖于工厂类,也就是说,如果要扩展程序,需要修改工厂类,违背了闭包的原则。因此就用到工厂方法模式:创建一个工厂接口和创建多个工厂实现类,这样一旦需要增加新的功能,就可以直接增加工厂类,而不用修改工厂接口原有的代码。

/**
 * 两种消息共同的接口
 */
public interface Message {
    public void send();
}
//QQ消息
public class QQMessage implements Message {
    @Override
    public void send() {
        System.out.println("发送QQ消息");
    }
}
//微信消息
public class WeiXinMessage implements Message {
    @Override
    public void send() {
        System.out.println("发送微信消息");
    }
}
//消息发送工厂接口
public interface MessageFactory {
   public Message sendMessage();
}
//发送QQ消息的工厂类
public class QQFactory implements MessageFactory {
    @Override
    public Message sendMessage() {
        return new QQMessage();
    }
}
//发送微信消息的工厂类
public class WeiXinFactory implements MessageFactory {
    @Override
    public Message sendMessage() {
        return new WeiXinMessage();
    }
}
//消息发送测试
public class MessageTest {
    public static void main(String[] args) {
        MessageFactory messageFactory=new QQFactory();
        Message message=messageFactory.sendMessage();
        message.send();
    }
}

这里写图片描述


抽象工厂模式(Abstract Factory)
抽象工厂模式有四种角色:

  • 抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心
  • 具体工厂(Concrete Factory)角色:这个角色直接创建实例
  • 抽象产品(Abstract Product)角色:这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
  • 具体产品(Concrete Product)角色:这个角色是具体的产品

    下面还是以发消息的例子来说明,假如可以发送QQ和微信两种消息,并且QQ可以发送语音消息和视频消息,微信可以发送文字消息和视频消息,其中,在这四种消息中,语音、文字属于省流量的消息,图片和视频属于费流量的消息。

第一:先创建两种消息接口

//QQ消息接口
public interface QQMessage {
}
//微信消息接口
public interface WeiXinMessage {
}

第二:(1)实现QQ下的两种消息发送方式

//QQ消息下的具体产品1:QQ语音消息
public class SoundQQMessage implements QQMessage{
    public SoundQQMessage(){
        System.out.println("发送QQ消息:QQ语音消息");
    }
}
//QQ消息下的具体产品2:QQ视频消息
public class VideoQQMessage implements QQMessage {
    public VideoQQMessage(){
        System.out.println("发送QQ消息:QQ视频消息");
    }
}

(2)实现微信下的两种消息发送方式

//微信消息下的具体产品1:微信文字消息
public class CharacterWeiXinMessage implements WeiXinMessage {
    public CharacterWeiXinMessage(){
        System.out.println("发送微信消息:微信文字消息");
    }
}

//微信消息下的具体产品2:微信图片消息
public class PhotoWeiXinMessage implements WeiXinMessage {
    public PhotoWeiXinMessage(){
        System.out.println("发送微信消息:微信图片消息");
    }
}

第三:发送消息的接口

//发送消息的工厂接口
public interface MessageFactory {
    public QQMessage sendQQMessage();
    public WeiXinMessage sendWeiXinMessage();
}

第四:实现具体的发送消息工厂

//具体的工厂类1:只负责发送语音文字这样省流量的信息
public class Sound_Character_MessageFactory implements MessageFactory {
    @Override
    public QQMessage sendQQMessage() {
        return new SoundQQMessage();
    }
    @Override
    public WeiXinMessage sendWeiXinMessage() {
        return new CharacterWeiXinMessage();
    }
}
//具体的工厂类2:只负责发送视频图片这样费流量的信息
public class Video_Photo_MessageFactory implements MessageFactory {

    @Override
    public QQMessage sendQQMessage() {
        return new VideoQQMessage();
    }

    @Override
    public WeiXinMessage sendWeiXinMessage() {
        return new PhotoWeiXinMessage();
    }
}

第五:发送消息测试

//发送消息测试
public class FactoryTest {
    public static void main(String[] args) {
        MessageFactory messageFactory1=null;
        System.out.println("工厂1:发送省流量的消息");
        messageFactory1=new Sound_Character_MessageFactory();
        messageFactory1.sendQQMessage();
        messageFactory1.sendWeiXinMessage();

        System.out.println(".................................");

        MessageFactory messageFactory2=null;
        System.out.println("工厂2:发送费流量的消息");
        messageFactory2=new Video_Photo_MessageFactory();
        messageFactory2.sendQQMessage();
        messageFactory2.sendWeiXinMessage();
    }
}

这里写图片描述


工厂方法模式 和 抽象工厂模式 的 区别

  • 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  • 工厂方法模式的具体工厂只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  • 工厂方法创建 “一种” 产品,抽象工厂需要创建一些列产品,说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值