Happy 设计模式之工厂模式(Java)

简介:

闲暇之余学习设计模式。只是把我理解的整理成笔记,如果有不对的地方,请各位大牛指出。

工厂模式
1、简单工厂模式、
2、工厂方法模式、
3、抽象工厂模式、

下面首先介绍简单工厂模式:
先看代码:

import java.util.Map;

/**
 * 发送服务
 * @author lenovo
 *
 */
public interface SendService {

    /**
     * 发送服务
     * @param messageBody
     * @return
     */
    public String sendMessage(Map<String, String> messageBody);

}

import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;

/**
 * 邮件服务
 * 
 * @author lenovo
 *
 */
public class EmailSendService implements SendService{

    @Override
    public String sendMessage(Map<String, String> messageBody) {
        //messageBody处理message业务,map可以应用里面传参数
        System.out.println("email-requst-messsage->" + JSONObject.toJSONString(messageBody));

        //返回的具体信息
        Map<String, String> response = new HashMap<String, String>();
        response.put("code", "5000");
        response.put("data", "成功发送邮件服务");

        //返回的json字符串
        String json = JSONObject.toJSONString(response);
        return json;
    }

}
import java.util.HashMap;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;

/**
 * 短信服务
 * 
 * @author lenovo
 *
 */
public class SmsService implements SendService{

    @Override
    public String sendMessage(Map<String, String> messageBody) {
        //messageBody处理message业务,map可以应用里面传参数
    System.out.println("sms-requst-messsage->" + JSONObject.toJSONString(messageBody));

        //返回的具体信息
        Map<String, String> response = new HashMap<String, String>();
        response.put("code", "5000");
        response.put("data", "成功发送短信服务");

        //返回的json字符串
        String json = JSONObject.toJSONString(response);
        return json;
    }

}
/**
 * 工厂类
 * 
 * @author lenovo
 *
 */
public class SendServiceFactory {

    /**
     * 创建发送服务模式
     * 
     * @param sendType
     * @return
     * @throws Exception
     */
    public static SendService createSendServiceFactory(String sendType) throws Exception {
        if(sendType == null)
            throw new Exception();
        if(sendType.equals("sms")) {
            return new SmsService();
        }
        else if(sendType.equals("email")) {
            return new EmailSendService();
        }
        else {
            throw new Exception();
        }
    }

}
import java.util.HashMap;
import java.util.Map;

public class SendClient {

    public static void main(String[] args) throws Exception {
        SendService smservice = SendServiceFactory.createSendServiceFactory("sms");
        Map<String, String> request = new HashMap<String, String>();
        request.put("body", "您好,请在三分钟内完成验证!");
        request.put("code", "2121");

        String response = smservice.sendMessage(request);
        System.out.println("response:" + response);
    }

}
输出
自己打印

到此简单工厂模式已经开发完毕,说下具体的细节。
简单工厂模式角色:
抽象产品角色-》SendService(发送服务)
具体产品角色-》EmailSendService和SmsService
工厂类角色-》SendServiceFactory
解释:建立一个工厂,来创建产品即可。客户端可以免除创建产品,以往的经验,用什么产品我直接在客户端new了,还需要产品的具体角色,这种模式,一看就是不太好,每当增加一个产品服务,都需要更改工厂类再添加一个具体产品服务。


工厂方法模式:
代码:
EmailSendService和SmsService和SendService没有变,还是原来的那套。
额外增加了邮件服务和短信服务的各自的工厂类。

/**
 * 抽象工厂角色
 * @author lenovo
 *
 */
public interface SendFactory {

    public SendService factory();

}

/**
 * 短信工厂
 * @author lenovo
 *
 */
public class SmsServiceFactory implements SendFactory{

    @Override
    public SendService factory() {
        // TODO Auto-generated method stub
        return new SmsService();
    }

}

/**
 * email服务工厂
 * @author lenovo
 *
 */
public class EmailSendServiceFactory implements SendFactory{

    @Override
    public SendService factory() {
        // TODO Auto-generated method stub
        return new EmailSendService();
    }

}

public class SendClient {

    public static void main(String[] args) throws Exception {
//      SendService smservice = SendServiceFactory.createSendServiceFactory("sms");
        Map<String, String> request = new HashMap<String, String>();
        request.put("body", "您好,请在三分钟内完成验证!");
        request.put("code", "2121");
//      
//      String response = smservice.sendMessage(request);
//      System.out.println("response:" + response);

        SendFactory emailservice = new EmailSendServiceFactory();
        String emailResponse = emailservice.factory().sendMessage(request);
        System.out.println("emailResponse:" + emailResponse);

        SendFactory smsFactory = new SmsServiceFactory();
        String smsResponse = smsFactory.factory().sendMessage(request);
        System.out.println("smsResponse:" + smsResponse);
    }

}

输出:
email-requst-messsage->{"code":"2121","body":"您好,请在三分钟内完成验证!"}
emailResponse:{"code":"5000","data":"成功发送邮件服务"}
sms-requst-messsage->{"code":"2121","body":"您好,请在三分钟内完成验证!"}
smsResponse:{"code":"5000","data":"成功发送短信服务"}

到此工厂方法模式完事:
角色:
1、抽象产品
2、具体的产品角色
3、抽象工厂
4、具体的产品对应的工厂
相比较简单工厂模式,区别在于,每个服务都有自己的工厂,工厂方法模式不在需要简单工厂的工厂类(SendServiceFactory),工厂方法每个都有自己的工厂,可以自己生产自己的服务,并且,再新添加服务的时候,原来的服务一点不需要动,直接可以平滑的添加,不影响其它业务代码。


抽象工厂模式:
代码:


/**
 * 手机
 * @author sdc
 *
 */
public interface Phone {

    public void createPhone();

}

/**
 * oppo手机生产线
 * @author sdc
 *
 */
public class OppoPhone implements Phone{

    @Override
    public void createPhone() {
        // TODO Auto-generated method stub
        System.out.println("生产oppo手机");
    }

}

/**
 * vivo生产线
 * @author sdc
 *
 */
public class VivoPhone implements Phone{

    @Override
    public void createPhone() {
        // TODO Auto-generated method stub
        System.out.println("生产vivo手机");
    }

}

/**
 * 手机工厂
 * @author sdc
 *
 */
public abstract class PhoneFactory {

    public abstract Phone createOppoPhone();

    public abstract Phone createVivoPhone();
}

/**
 * 工厂1,来生产oppo和vivo
 * @author sdc
 *
 */
public class PhoneFactory1 extends PhoneFactory{

    @Override
    public Phone createOppoPhone() {
        // TODO Auto-generated method stub
        return new OppoPhone();
    }

    @Override
    public Phone createVivoPhone() {
        // TODO Auto-generated method stub
        return new VivoPhone();
    }

}

/**
 * 客户端类
 * @author sdc
 *
 */
public class Client {

    public static void main(String[] args) {
        PhoneFactory pf1 = new PhoneFactory1();
        Phone oppoPhone = pf1.createOppoPhone();
        Phone vivoPhone = pf1.createVivoPhone();

        oppoPhone.createPhone();

        vivoPhone.createPhone();
    }

}

代码完结;

从代码可以看出一个生产线上的vivo手机和oppo手机被一个工厂生产出来,如果某个公司想再开一个分厂同样生产这个vivo和oppo手机,就是单纯呢实现那个抽象工厂模式或者甚至可以用那个厂的实现类即可,可以看出非常方便。
但是,如果再加一个产品:华为呢?是不是要更改抽象工厂,原来实现此抽象工厂的类都要重写,其实这就是抽象工厂和工厂方法的模式的区别。


本文转自 豆芽菜橙 51CTO博客,原文链接:http://blog.51cto.com/shangdc/2052728


相关文章
|
4月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
504 2
|
4月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
450 0
|
6月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
4月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
599 35
|
4月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
408 8
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
332 4
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
223 4
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
127 11