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()

}

posted @ 2024-06-17 12:20  zongzw  阅读(23)  评论(0)    收藏  举报