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

本文涉及的产品
短信服务,100条 3个月
短信服务,200条 3个月
国际/港澳台短信套餐包,全球plus 100条 6个月
简介:

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

工厂模式
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


相关文章
|
30天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
46 0
[Java]23种设计模式
|
14天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
1月前
|
设计模式 Java
Java设计模式
Java设计模式
29 0
|
1月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
30 0
|
设计模式 Java 程序员
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
|
设计模式 Java
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
|
8天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
7天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
下一篇
无影云桌面