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

本文涉及的产品
短信服务,100条 3个月
国际/港澳台短信套餐包,全球plus 100条 6个月
数字短信套餐包(仅限零售电商行业),100条 12个月
简介:

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

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


相关文章
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
42 4
|
3月前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
58 0
[Java]23种设计模式
|
2月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
3月前
|
设计模式 Java
Java设计模式
Java设计模式
41 0
|
设计模式 Java 程序员
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
|
设计模式 Java
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
|
10天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
12天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
12天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。