java设计模式之工厂模式--普通工厂方法模式(Factory Method)

2024-05-19 19:58

本文主要是介绍java设计模式之工厂模式--普通工厂方法模式(Factory Method),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。

2.先定义一个接口:

package com.zhong.pattern.factorymethod;
/*** 发送接口* @author admin**/
public interface Sender {/*** 发送消息方法* @param msg*/void send(String msg);
}
3.编写实现Sender接口的类
package com.zhong.pattern.factorymethod;
/*** 短信发送* @author admin**/
public class SmsSender implements Sender {@Overridepublic void send(String msg) {System.out.println("发送短信"+msg);}}
package com.zhong.pattern.factorymethod;
/*** 邮件发送实现* @author admin**/
public class EmailSender implements Sender {	@Override
	public void send(String msg) {
		System.out.println("发送邮件"+msg);
	}
}

4.定义工厂类

package com.zhong.pattern.factorymethod;/*** 工厂类* @author admin**/
public class SenderFactory {/*** 根据类型返回对象* @param type* @return*/public Sender produce(String type) {  if ("email".equals(type)) {  return new EmailSender();  } else if ("sms".equals(type)) {  return new SmsSender();  } else { System.out.println("请输入正确的类型!");  return null;  }  }  
}

5.编写客户端代码

package com.zhong.pattern.factorymethod;
/*** * @author admin**/
public class SenderFactoryTest {public static void main(String[] args) {SenderFactory sf = new SenderFactory();Sender emailSender = sf.produce("email");emailSender.send("邮件");Sender smsSender = sf.produce("sms");smsSender.send("短信");}}
6.缺点:违反设计思想中开闭原则。因为如果新增一个Sender接口的实现类的话,都需要改变SenderFactory的实现。

这篇关于java设计模式之工厂模式--普通工厂方法模式(Factory Method)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995898

相关文章

Spring框架的核心原则和IoC容器介绍

Spring框架是一个开源的应用程序框架,它遵循以下核心原则:   1.Inversion of Control(控制反转): Spring框架通过IoC容器管理对象的生命周期和依赖关系,而不是由程序代码直接创建对象。这样可以降低组件之间的耦合度,提高系统的灵活性和可维护性。 1.面向切面编程(AOP): Spring框架支持AOP,可以在不修改源码的情况下,增加新的功能,如日志、事务管理等

java中自动装箱的变态小题目

Integer i1 = 100; Integer i2 =100; boolean b1 = i1== i2;//结果为true   Integer i3 =200; Integer i4 =200; boolean b2 = i3 == i4;//结果为false 完整代码:(编译器二次加工) package cn.jdk.integer;public class Inte

Java集合框架-Map-01天

/** Map集合,该集合存储键值对。一对一对往里存。而且要保证键的唯一性* 1,添加* put(K key,V value)* putAll(Map<? extends K,? extends V> m)* 2,删除* clear()* remove(Object key)* 3,判断* containsValue(Object value)* containsValue

java:spring-security的简单例子

【pom.xml】 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version></dependency><dependency><groupId>org.springframewo

【Java反射】getDeclaredField(String name) 和 getField(String name)区别

getDeclaredField(String name) 和 getField(String name) 都是Java反射API中用于获取类字段(成员变量)的方法,但它们之间存在一些关键的区别: getDeclaredField(String name) 功能:这个方法返回的是声明在该类中的指定名称的字段,包括私有、受保护、默认(包访问权限)和公有字段,不论该字段是在哪个类中声明的。也就是说

Java反射之——方法反射的基本操作

package com.imooc.reflect;import java.lang.reflect.Method;public class MethodDemo1 {public static void main(String[] args) throws Exception {//要获取print(int ,int )方法 //1,要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类

Java反射之通过反射获取一个对象的方法信息

以下代码为一个工具类 package com.imooc.reflect;import java.lang.reflect.Method;public class ClassUtil {public static void printClassMessage(Object obj){//要获取类的信息,首先要获取类的类类型Class c = obj.getClass();//传递的是哪个子类

Java反射之类的实例对象的三种表示方式

<span style="font-size:14px;">package com.imooc.reflect;public class ClassDemo1 {public static void main(String[] args) {//Foo的实例对象如何表示Foo foo1 = new Foo();//foo1就表示出来了//Foo这个类,也是一个实例对象,Class类的实例对象,如

Java中的二维数组和c语言中的二维数组的区别

我觉得,JAVA的多维数组其实是数组包数组,即他们下一个数组是独立的,可以独立分配内存大小,跟C语言的数组不一样,C语言的数组无论维数是多少,他们每一维的内存大小都一样。 打个比方: JAVA的三维数组 某公司有m个工厂,这个是第一维; 每个工厂有n个仓库,这个是第二维; 每个仓库有o件库存,这是第三维; 每个工厂的仓库数量都不同,每个仓库的库存数量又都不同。 通过

Java中的克隆close()和赋值引用的区别

学生类Student: package 克隆clone;/*要克隆必须实现这个借口:Cloneable,以标记这个对象可以克隆Cloneable:此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。 这个接口是标记接口,告诉我们实现该接口的类就可以实现对象的复制了。*/public class Student implemen