java中简单工厂模式、工厂方法模式、抽象工厂模式介绍

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

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

--------------------------------------------------------------------------------

以发送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();
    }
}

 

--------------------------------------------------------------------------------

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

•工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
•工厂方法模式的具体工厂只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
•工厂方法创建 “一种” 产品,抽象工厂需要创建一些列产品,说抽象工厂就像工厂,而工厂方法则像是工厂的一种产品生产线。

时间: 2024-09-27 05:47:32

java中简单工厂模式、工厂方法模式、抽象工厂模式介绍的相关文章

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

[本文转自简单工厂.工厂方法.抽象工厂.策略模式.策略与工厂的区别] 结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们

Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂)

Java技术_每天掌握一种设计模式(001)_设计模式概念及分类 Java技术_每天掌握一种设计模式(002)_使用场景及简单实例(创建型:单例模式) Java技术_每天掌握一种设计模式(003)_使用场景及简单实例(创建型:工厂方法) Java技术_每天掌握一种设计模式(004)_使用场景及简单实例(创建型:抽象工厂) Java技术_每天掌握一种设计模式(005)_使用场景及简单实例(创建型:建造模式) Java技术_每天掌握一种设计模式(006)_使用场景及简单实例(创建型:原型模式) 1.

JS自定义对象实现Java中Map对象功能的方法

这篇文章主要介绍了JS自定义对象实现Java中Map对象功能的方法,可实现类似Java中Map对象增删改查等功能,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容! 这里Key

java中简单的线程问题

问题描述 java中简单的线程问题 我只创建了一个对象,为何运行的时候会有两个第五张票出现?即便是把上面的tickets变量加上static也是同样的结果 解决方案 加不加static与是否会发生多线程冲突无关,你需要在执行代码处加个锁防止多个线程同时调用一个对象 解决方案二: 源代码发我一下,多线程就是指多个对象对某个RUN方法多次调用. 解决方案三: 线程同步问题吧... 最好贴个代码出来. 解决方案四: 如果不想修改代码,也找不到错误,那么就在要执行逻辑代码之前去下重呗,虽然这样不合理.

JS自定义对象实现Java中Map对象功能的方法_javascript技巧

本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容!   这里Key,你要使用String类型,和Java一样,你可以进行一些增加,删除,修改,获得的操作. 使用很简单,我先把工具类给大家看下: 复制代码 代码如下: /**  *

关于java中被private修饰的方法默认为final的问题

问题描述 关于java中被private修饰的方法默认为final的问题 class Demo{ private void method(){ System.out.println("haha"); } class Ex extends Demo{ private void method(){ System.out.println("gaga"); } } public static void main(String[] args){ Demo b=new Demo

js接收并转化Java中的数组对象的方法_javascript技巧

在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进行内容的转化,后来发现不可以,网上说js与java没有桥接的东西,所以呢: 我的解决方案是:在action层,将java的对象数组转化为Json串,而在js中,再把json转化为数组对象. 1.将java的对象数组转化为Json串: 要用到两个类: net.sf.json.JSONObject ne

关于Java中停止线程执行的方法总结

Java中停止线程执行的方法 一.暂停或停止线程的理论 在Java编程中,要暂停或停止当前正在运行的线程,有几种方法.对于把线程转入睡眠Sleep状态,使用Thread.sleep()是最正确的方式.或许有人会问,为什么不使用等待wait()或通知notify()?要知道,使用等待或通知都不是很好的方式.线程可以使用等待wait()实现被阻塞,这属于条件等待的方式,当条件满足后,又会从阻塞转为等待状态.尽管可以在等待wait()条件那里放一个超时设置,但等待wait()的设计目的不是这样的,等待

java中System.out.println( );这个方法是

问题描述 java中System.out.println( );这个方法是 java中System.out.println( );这个方法是System类里的out对象的println方法的意思,即类.对象.方法 解决方案 对,就是这个意思.... 解决方案二: 假设有一个实例Object o则当System.out.println(o);时,它其实是自动调用o.toString()方法,然后输出该方法返回的string字符串.当System.out.println(o.toString());

java中没有方法体的方法是什么方法,

问题描述 java中没有方法体的方法是什么方法, java中没有方法体的方法是什么方法,省略方法体的方法是什么方法,如何区分一个没有方法体的方法到底是省略了方法体还是木有方法体? 解决方案 Java规范中没有或方法体为空的方法主要包括:抽象方法.接口方法.native修饰的本地方法. 如果非要语言化表述,应该可以这样描述: 抽象类中的方法--方法体为空 接口中的方法--没有方法体 本地方法--方法体需要被省略 解决方案二: 你说的应该是抽象方法,或者是写在接口中的函数定义.定义为abstract