首页 > 其他分享 >OO设计模式中的工厂模式

OO设计模式中的工厂模式

时间:2024-06-17 12:20:56浏览次数:14  
标签:OO 创建 工厂 实例 抽象 子类 具体 设计模式

读书笔记:
New 具体类实例即为针对实现编程,因为因此而在代码中具体化了一个类,将来会有可能带来修改,而如果针对接口编程,即在代码中用抽象类代替具体类,则不易于引起修改。

简单工厂:
严格来说不是设计模式,只是编程良好规范,将易于变化的部分抽取出来封装。

工厂方法:
定义了创建对象的框架,实际创建工作由具体的子类完成。子类不同创建的实例类型也不同。用于创建一个对象。通过继承完成解耦。

抽象工厂:
创建一系列的对象;将创建过程与客户程序解耦,工厂子类负责一组对象的创建;工厂抽象类中定义了多个工厂方法;多个工厂子类可供客户程序根据自己的需要作选择;通过组合实现解耦。
抽象工厂中每一种对象的创建都是用了工厂方法模式,即实际对象的创建延迟到抽象工厂子类中做具体对象创建。

抽象工厂的缺点:
当被创建的对象家族中有新的成员类时,抽象工厂模式的程序面临全部修改。

依赖倒置:不依赖于具体类型,而依赖于抽象类型,也即依赖于接口。

23/04/2018 12:33 AM

工厂方法 着眼于 对象如何创建。
抽象工厂 着眼于 一组对象的创建过程。

比如用抽象工厂模式创建 UI的各个组成部分:字体 工具栏 边角 颜色。。
concreteFactoryA 实现了 加粗字体 全集工具栏 圆形边角 红色风格
客户端程序调用concreteFactoryA就能得到这个组合样式。

工厂方法是工厂模式的一个维度。将创建延迟到子类。

2024/6/17 11:25

简单工厂:就是用同一个工厂类,根据要求(if-else)生产不同的实例
抽象工厂:用具体的工厂类 去生产 具体的实例。
工厂方法:看上去,和抽象工厂没有本质的差别,只是创建 单个具体实例。。

package main

import "log"

type AbstractFactory interface {
	CreateA()
	CreateB()
}

type Factory1 struct{}
type Factory2 struct{}

func (f *Factory1) CreateA() {
	log.Println("A1")
}
func (f *Factory1) CreateB() {
	log.Println("B1")
}
func (f *Factory2) CreateA() {
	log.Println("A2")
}
func (f *Factory2) CreateB() {
	log.Println("B2")
}

var (
	// check type struct implemented all interface's methods.
	_ AbstractFactory = (*Factory1)(nil)
)

/**
 * 简单工厂:就是用同一个工厂类,根据要求(if-else)生产不同的实例。
 * 抽象工厂:抽象工厂定义框架,用具体的工厂类 去生产 具体的实例。
 * 工厂方法:和抽象工厂没有本质的差别,只是,具体工厂仅用于创建单个具体实例。
 */
func main() {
	var f AbstractFactory

	f = &Factory1{}
	f.CreateA()
	f.CreateB()

	f = &Factory2{}
	f.CreateA()
	f.CreateB()

}

标签:OO,创建,工厂,实例,抽象,子类,具体,设计模式
From: https://www.cnblogs.com/zongzw/p/18252147

相关文章

  • 【odoo | SQL】odoo使用sql语句操作数据库
    概要        Odoo的SQL指的是在Odoo框架内使用SQL语句直接操作数据库。这些操作通常是通过Odoo提供的数据库游标(self.env.cr)来执行的。虽然Odoo主要鼓励使用其ORM(对象关系映射)来进行数据库操作,因为ORM更安全、易维护且与Odoo的模型和视图系统深度集成,但在某些情况下,直......
  • 【odoo17】富文本小部件widget=“html“的使用
    概要        HTML富文本字段通常用于在模型中存储和显示格式化的文本。通过这种字段,用户可以利用HTML标签来格式化文本,从而在前端呈现更丰富的内容。        在Odoo中,HTML字段在没有明确指定widget="html"的情况下,也会默认显示为富文本编辑器。这是因为Odoo......
  • 【PL理论】(29) OOP:面向对象编程 | 案例研究:C++ 中的类 | 继承 | 继承和指针 | Object
    ......
  • 10、ansible-YAML-非标记语言-剧本的编写-.yaml -剧本执行ansible-playbook-handlers
     ============================================================剧本的编写==================================================通过YAML编写一个剧本,完成web的部署,配置,启动的全过程1、先将目标主机的网站服务卸载ansibleall-myum-a'name=httpdstate=removed'-o·a......
  • c/c++设计模式--备忘录模式
    #include<iostream>#include<vector>#ifdef_DEBUG//只在Debug(调试)模式下#ifndefDEBUG_NEW#defineDEBUG_NEWnew(_NORMAL_BLOCK,__FILE__,__LINE__)//重新定义new运算符#definenewDEBUG_NEW#endif#endif//#include<boost/type_index.hpp>usingna......
  • 盘点 Spring Boot 解决跨域请求的几种办法
    熟悉web系统开发的同学,对下面这样的错误应该不会太陌生。之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击web服务器盗取数据。01、什么是跨域请求同源策略,简单的说就是当浏览器访问web服务器资源时,只有源相同才能正常进行通信,即......
  • 使用SpringBoot对接Kafka
    Kafka是什么,以及如何使用SpringBoot对接Kafka一、Kafka与流处理我们先来看看比较正式的介绍:Kafka是一种流处理平台,由LinkedIn公司创建,现在是Apache下的开源项目。Kafka通过发布/订阅机制实现消息的异步传输和处理。它具有高吞吐量、低延迟、可伸缩性和可靠性等优点,使其成为......
  • 基于springboot的球队训练信息管理系统源码数据库
    传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,球队训练信息管理系......
  • 基于springboot的青年公寓服务平台源码数据库
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,房屋信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的青年公寓服务平台。本青年公寓服务......
  • Token、Cookie、Session 、UA有什么区别
    Token、Cookie、Session、UA在Web开发和网络通信中各自扮演着不同的角色,以下是它们之间的区别:Token:定义:Token是服务经过计算发给客户端的,服务不保存,每次客户端来请求,经过解密等计算来验证是否是自己下发的。特性:可编程性:基于区块链技术的Token可以通过智能合约进行......