工厂模式是一种创建型设计模式,其目的是为了创建对象而不需要暴露对象的创建逻辑。
在工厂模式中,我们定义一个工厂类,该类负责创建其它类对象,同时客户端代码只需要调用工厂类的方法即可创建对象,而不需要了解对象的具体实现细节。这样可以避免客户端代码和具体实现之间的紧耦合。
工厂模式通常分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。
- 简单工厂模式:
简单工厂模式又叫静态工厂模式,是最简单的工厂模式。在简单工厂模式中,我们定义一个工厂类,该类负责根据客户端的请求创建合适的对象实例。
- 工厂方法模式:
工厂方法模式又叫多态工厂模式。在工厂方法模式中,我们定义一个抽象工厂类,由子类来具体实现创建对象的方法。每个子类都实现了工厂类的抽象方法,以便创建具有不同特征的对象。
- 抽象工厂模式:
抽象工厂模式是工厂方法模式的延伸。在抽象工厂模式中,我们定义了一个工厂接口,这个接口可以生产相关的产品。不同的工厂类可以生产不同的产品,在使用抽象工厂模式的过程中,我们可以使用不同的工厂类来创建不同的产品。
Golang 中的实现:
Copy codetype Car interface {
Drive() string
}
type SUVCar struct{}
func (s *SUVCar) Drive() string {
return "Drive SUV"
}
type SedanCar struct{}
func (s *SedanCar) Drive() string {
return "Drive Sedan"
}
type SportCar struct{}
func (s *SportCar) Drive() string {
return "Drive Sport"
}
type CarFactory struct{}
func (f *CarFactory) CreateCar(carType string) (Car, error) {
switch carType {
case "SUV":
return &SUVCar{}, nil
case "Sedan":
return &SedanCar{}, nil
case "Sport":
return &SportCar{}, nil
default:
return nil, fmt.Errorf("Invalid car type: %s", carType)
}
}
// 使用工厂创建 SUV 车
factory := &CarFactory{}
car, err := factory.CreateCar("SUV")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(car.Drive())
在上述代码中,我们首先定义了一个 Car 接口,该接口定义了 Drive 方法,返回一个字符串表示驾驶该汽车类型。然后我们定义了三个不同的汽车类型,分别是 SUVCar,SedanCar 和 SportCar。每个汽车类型都实现了 Car 接口方法 Drive。
接下来定义了一个 CarFactory 结构体,它包含了一个 CreateCar 方法,该方法根据传入的车辆类型参数创建对应的具体车辆,并返回实现了 Car 接口的对象。
我们使用工厂模式创建 SUV 车,首先创建 CarFactory 对象,然后调用 CreateCar 方法创建 SUV 车实例并返回。最后调用 Drive 方法返回 "Drive SUV" 字符串,表示驾驶 SUV 车。
总体来说, Golang 的工厂模式与其他编程语言实现的工厂模式十分相似,只是语法不同。
php 中的实现
class SUVCars{
}
class SedanCars{
}
class SportCars{
}
class CarFactory
{
static public function createCar($type)
{
switch ($type) {
case 'SUV':
return new SUVCars();
case 'Sedan':
return new SedanCars();
case 'Sport':
return new SportCars();
default:
throw new Exception('Invalid type.');
}
}
}
//创建 Sedan Cars
$car = CarFactory::createCar('Sedan');
工厂类 CarFactory 定义了一个 createCar 静态方法,该方法根据传入的汽车类型参数创建不同的具体汽车对象,并返回该对象。客户端代码只需要调用工厂类的 createCar 方法,而不需要了解具体的实现细节。这个 createCar 方法就是一个简单工厂模式的例子。