博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式——简单(静态)工厂模式
阅读量:3916 次
发布时间:2019-05-23

本文共 1954 字,大约阅读时间需要 6 分钟。

简单(静态)工厂模式:

        采用工厂的思维,其实就是利用工厂对象来创建需要的对象,为了方便创建对象,即一个工厂可以创建多个同一类型的对象。要实现此种效果,就得抽取这些对象的共同属性和方法建立抽象成父类或者接口,在工厂类中利用多态,即父类或接口引用指向子类对象。

简单工厂模式有三个角色: 

  • 工厂类:负责根据特定的标志生成不同的对象实例; 
  • 共同父类:拥有子类共同属性,用于工厂模式调用时接收实例; 
  • 具体子类:实现各个子类特定属性 

1.首先创建一个水果工厂(父类)接口:

package factory;public interface Fruit {	public void getFruit() ;}

2.然后我们创建水果(子类)来实现这些接口:

package factory;public class Apple implements Fruit{	@Override	public void getFruit() {		System.out.println("生产苹果");	}	}
package factory;public class Banner implements Fruit{	@Override	public void getFruit() {		System.out.println("生产香蕉");	}}

3.最后我们来创建一个水果工厂,用来创建水果实例:

package factory;public class FruitFactory {	//定义一个静态方法	public static  Fruit CreatFruit(String fruit){		if(fruit.equalsIgnoreCase("apple")) {			return new Apple();		}else if(fruit.equalsIgnoreCase("banner")) {			return new Banner();		}else {			return null;		}	}}

4.创建一个测试类:

package factory;public class Test {	public static void main(String[] args) {		Fruit apple = FruitFactory.CreatFruit("apple");		Fruit banner = FruitFactory.CreatFruit("banner");		apple.get();		banner.get();	}}

        但是这种静态工厂的缺点显而易见,我生产两种水果就需要写三个if、else判断语句,如果生产 1000 种水果就需要 1001 个if、else语句这显然是很没有效率的。为此,我们可以用反射的方式对它进行一些优化。

5.用反射进行优化工厂方法:

package factory;public class FruitFactory {	//定义一个静态方法	@SuppressWarnings("deprecation")	public static  Fruit CreatFruit(String fruit) throws Exception{		Class
clazz = Class.forName(fruit); return (Fruit)clazz.newInstance(); }}

为此,对应的调用方法也要更改:

package factory;public class Test {	public static void main(String[] args) throws Exception {		Fruit apple = FruitFactory.CreatFruit("factory.Apple");		Fruit banner = FruitFactory.CreatFruit("factory.Banner");		apple.get();		banner.get();	}}

        有同学可能发现了,使用反射需要全限定类名,那么写那么多全限定类名是不是太累了?对的,对这种全限定类名,可以使用一个常量类将其设置为常量,或是使用配置文件,这样是不是很方便? 

但是简单静态工厂仍存在一系列缺陷:

  • 简单工厂的工厂类中包含所有实例的创建逻辑,一旦该工厂类出问题,所有的实例都无法创建;
  • 违背设计模式的开闭原则:在添加新实例的时候,必须要修改工厂类中的原有逻辑,久而久之会使工厂类更加复杂(前文中的反射方式解决了这个问题,但也会造成配置文件的负担等问题)。
  • 工厂类中使用了static修饰方法,无法被继承和重写,造成问题。

转载地址:http://wzprn.baihongyu.com/

你可能感兴趣的文章
部署Dotnet Core应用到Kubernetes(二)
查看>>
持续交付二:为什么需要多个环境
查看>>
简单理解线程同步上下文
查看>>
购票啦 | 2020中国.NET开发者峰会启动
查看>>
FreeSql接入CAP的实践
查看>>
浅析 EF Core 5 中的 DbContextFactory
查看>>
听说容器正在吃掉整个软件世界?
查看>>
使用WebBenchmark对webapi进行管理和性能测试
查看>>
持续交付三:动手自动化“开发”—>“测试”
查看>>
WebBenchmark动态测试Webapi
查看>>
Windows 7 安装 .NET 5 / .NET Core 3.1 环境的方法和依赖文件
查看>>
接口幂等设计探索实践
查看>>
微服务很香--麻辣味,但要慢慢消化
查看>>
asp.net core 使用 TestServer 来做集成测试
查看>>
解锁环境变量在云原生应用中的各种姿势
查看>>
分享我的写作经验
查看>>
Azure 静态 web 应用集成 Azure 函数 API
查看>>
关于.NET5在IIS中部署的几个问题总结
查看>>
Wifi6网络
查看>>
真实经历:整整一年了,他是这样从程序员转型做产品经理的
查看>>