百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

OOP设计模式:简单工厂&工厂方法

liebian365 2024-10-21 08:47 20 浏览 0 评论

反复强调的概念

好的需求分析师在实施之前能够分析清楚85%需求,架构师的技术框架设计能够90%忠于需求,开发人员开发、设计实现95%的内容就很不错了 1-85%*90%*95% ≈ 27%,也就是说即便是一个精英团队,在编码阶段有1/4的内容是无法准确分析的,所以在测试阶段甚至是上线实施运维阶段,要应对这些纠正、纠偏的快速响应,开发设计灵活的应用程序就显得尤为重要。

设计模式的六大原则:

1、单一职责原则,又称单一功能原则,即一个类的功能要限定在某个域下面,其核心就是控制类的粒度大小、建立对象之间的松耦合关系耦、提高自身的内聚特性;

2、开闭原则。对扩展开放,对修改关闭;类的功能抽象,要做到哪些是对外的功能,对外功能的设计要灵活可扩展,对应内部的、不需要外部知晓的,不要暴露出去。很多人习惯提供给别人万能的接口,殊不知这是工程不可控的开端,你会发现随着功能的完善,因为外部调用的原因,积劳成疾,你的实现变成历史原因,成为设计上的瓶颈。

3、里氏替换原则。使用基类的地方都可以用子类替换,而不影响功能;也就是要做到子类可以扩展父类的功能,但是不能改变父类原有的功能。

4、依赖倒置原则。高层模块不应该依赖于低层模块,而是应该依赖于抽象。换句话说,具体实现应该依赖于抽象,而不是抽象依赖于具体实现;

5、接口隔离原则。抽象的接口功能要有一定的粒度,可以按照单一职责的方法进行抽象,只不过其抽象的是接口功能。

6、迪米特法则。又叫最少知识原则,一个类对于其它类知道的越少越好,也就是减少对外界信息的依赖,而这种复杂的关系都有中间类来实现。

工厂模式

工厂方法是创建型模式中最为典型的,也是最具启发效果的,它告诉我们对应使用一个变化频率比较高的类不必忙着new操作,而是要依赖一个抽象的类型,这样才可以应对其不断变化带来的副作用。

1、简单工厂

  • 静态结构图
  • 特点:

1、通过IProduct隔离了Client和具体(ConcreteProduct)的依赖关系,这样就可以把Product的变化隔离在Client的逻辑之外。

2、ConcreteProduct的增加、删除方法或属性,修改实现过程,不会影响Client。

  • 代码描述
public interface IProduct {
	String getModel();
}

public enum Category {
	A,B
}

public class ConcreteProductA implements IProduct {
	@Override
	public String getModel() {
		return "A";
	}
}

public class ConcreteProductB implements IProduct {
	@Override
	public String getModel() {
		return "B";
	}
}

public class Factory {
	public IProduct create(Category category) {
		switch	(category) {
		case A:
			return new ConcreteProductA();
		case B:
			return new ConcreteProductB();
		default:
			return null;
		}
	}
}

Client端调用

public static void main(String[] args) {
	Factory factory = new Factory();
	IProduct product = factory.create(Category.A);
	System.out.println(product.getModel());//A
}

2、工厂方法

简单工厂实现了把目标实例的创建工作交给一个外部的工厂来完成,它会根据条件生产出相应的产品。但如果应用中只需要一种工厂,而且这个工厂的职责又比较单一,就是作为new的一个替代品,我们就可以进一步抽象为工厂方法。

  • 静态结构图
  • 特点:

Client需要隔离它与具体类型间的耦合关系,甚至是我们在开发过程中我们还无法预知生产环境中实际要提供Client需要创建的具体类型。工厂的实现可能来源于外部程序或第三方,而且每个工厂的实现都是由不同的厂商来提供。

  • 代码描述
public interface IProduct {
	String getModel();
}

public interface IFactory {
	IProduct create();
}

public class ProductA implements IProduct {
	@Override
	public String getModel() {
		return "A";
	}
}

public class ProductB implements IProduct {
	@Override
	public String getModel() {
		return "B";
	}
}

public class FactoryA implements IFactory {
	@Override
	public IProduct create() {
		return new ProductA();
	}
}

public class FactoryB implements IFactory {
	@Override
	public IProduct create() {
		return new ProductB();
	}
}

解耦用的中间类

/***
 * 该类的组织形式,可以通过外部配置解耦的方式来实现
 * 例如把具体的工厂类配置到配置文件中,技术上通过反射的方法进行实例化
 */
public class Assembler {
	public IFactory getProductFactory() {
		String fatoryName = "pattern.sample.factory.method.FactoryB";
		return (IFactory)BeanUtils.getInstance(fatoryName);
	}
}

Client端调用

public static void main(String[] args) {
	Assembler assembler = new Assembler();
	IFactory factory = assembler.getProductFactory();
	IProduct product = factory.create();
	System.out.println(product.getModel());//B
}

欢迎感谢大家点赞支持,你们的支持是我创作的动力源泉。

相关推荐

C#夯实基础-Lambda在List中的使用

在C#中基本类型比如List,Dictionary,数组等都有委托来实现相关的操作。此时Lambda表达式就可以使用了.实例1,查找字符串List的包含a的元素...

在C#中,如何实现对集合中元素的自定义排序?

在C#中,可以通过多种方式实现对集合中元素的自定义排序,主要包括:...

C++11 新特性面试题_c++ 11 面试题

1、C++11中引入了哪些新的智能指针类型?请描述它们的用法和区别。C++11中引入了三种新的智能指针类型:std::unique_ptr,std::shared_ptr,和std::weak_...

为什么要使用lambda表达式?原来如此,涨知识了

为什么要使用Lambda表达式先看几段Java8以前经常会遇到的代码:创建线程并启动...

[编程基础] Python lambda函数总结

Pythonlambda函数教程展示了如何在Python中创建匿名函数。Python中的匿名函数是使用lambda关键字创建的。...

硬核!Java 程序员必须掌握的 10 个 简化代码的 Lambda 表达式!

大家好,我是一位在架构师道路上狂奔的码农,今天给大家介绍一下程序员必须掌握的10个Lambda表达式,这些表达式几乎涵盖了在实际编程中经常用到的常见场景。相信通过这10个Lambda表...

一文读懂lambda表达式_lambda表达式由来

作者:youngyan,腾讯PCG数据工程工程师...

Java基础知识 - lambda 表达式_javalambda表达式用法

1、表达式语法1)lambda的命名采用的是数学符号λ;...

Python学习笔记 | 匿名函数lambda、映射函数map和过滤函数filter

什么是匿名函数?定义:没有函数名的自定义函数场景:函数体非常简单,使用次数很少,没有必要声明函数,通常搭配高阶函数使用。...

Java Lambda表达式详解(非常全面)

JavaLambda表达式是JDK8引入的,是一个比较重要的特性。@mikechenLambda表达式简介...

Python函数—lambda表达式_python中lambda函数的用法讲解

目录...

了解 Lambda:Python 中的单个表达式函数

Python中的lambda关键字提供了声明小型匿名函数的快捷方式。Lambda函数的行为与使用...

在C#中使用Lambda编写一个排序算法,比较其与传统排序算法的优劣

使用Lambda表达式编写排序算法在C#中,Lambda表达式可以用来简化排序逻辑的编写,尤其是在需要自定义排序规则时非常方便。以下示例展示了如何用Lambda表达式实现排序,并与传统排...

一日一技:python中的匿名函数 lambda用法

匿名函数lambda,语法如下:lambdaarguments:expression...

《回炉重造》——Lambda表达式_回炉重造是贬义词吗

前言Lambda表达式(LambdaExpression),相信大家对Lambda肯定是很熟悉的,毕竟我们数学上经常用到它,即λ。不过,感觉数学中的Lambda和编程语言中的Lamb...

取消回复欢迎 发表评论: