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


相关文章
|
9天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1天前
|
设计模式 算法 Java
小谈设计模式(30)—Java设计模式总结
小谈设计模式(30)—Java设计模式总结
|
2天前
|
设计模式 存储 Java
Java设计模式:解释一下单例模式(Singleton Pattern)。
`Singleton Pattern`是Java中的创建型设计模式,确保类只有一个实例并提供全局访问点。它通过私有化构造函数,用静态方法返回唯一的实例。类内静态变量存储此实例,对外仅通过静态方法访问。
10 1
|
4天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
16 0
|
6天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
10 0
|
7天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
24 4
|
9天前
|
设计模式 Java
23种设计模式,命令模式的概念优缺点以及JAVA代码举例
【4月更文挑战第7天】命令模式是一种行为设计模式,它将请求或简单操作封装为一个对象。这种模式允许用户通过调用对象来参数化其他对象的方法,并能保存、排队和执行方法调用。
16 1
|
9天前
|
设计模式 缓存 安全
分析设计模式对Java应用性能的影响,并提供优化策略
【4月更文挑战第7天】本文分析了7种常见设计模式对Java应用性能的影响及优化策略:单例模式可采用双重检查锁定、枚举实现或对象池优化;工厂方法和抽象工厂模式可通过对象池和缓存减少对象创建开销;建造者模式应减少构建步骤,简化复杂对象;原型模式优化克隆方法或使用序列化提高复制效率;适配器模式尽量减少使用,或合并多个适配器;观察者模式限制观察者数量并使用异步通知。设计模式需根据应用场景谨慎选用,兼顾代码质量和性能。
|
设计模式 Java 程序员
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(三)
|
设计模式 Java
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)
【Java设计模式】用 披萨订购案例 详细讲解三种工厂模式(二)