NOTE

6.5 工厂方法

相对于简单工厂有多个工厂类。我们可以传递具体工厂实例而不是具体的产品到子类中,当需要的时候再调用工厂实例的创建产品方法(等于把创建实例对象的时机延迟到子类中) 1. uml 2. Java 2.1. client 2.2. 工厂 2.3. 产品 3. Golang 3.1. 工厂 3.2. 产品 3

Software Architecture & Engineering创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

相对于简单工厂有多个工厂类。我们可以传递具体工厂实例而不是具体的产品到子类中,当需要的时候再调用工厂实例的创建产品方法(等于把创建实例对象的时机延迟到子类中)

1. uml

PlantUML 图表

2. Java

2.1. client

public class Client
{
    public static void main(String[] args)
    {
        Car car = new AudiCarFactory().getCar();
        car.run();

        Car car2 = new QQCarFactory().getCar();
        car2.run();

    }
}

2.2. 工厂


public interface CarFactory
{
    Car getCar();
}
public class AudiCarFactory implements CarFactory
{
    @Override
    public Car getCar()
    {
        return new AudiCar();
    }
}
public class QQCarFactory implements CarFactory
{
    @Override
    public Car getCar()
    {
        return new QQCar();
    }
}

2.3. 产品

public interface Car
{
    void run();
}
public class AudiCar implements Car
{
    @Override
    public void run()
    {
        System.out.println("奥迪");
    }
}
public class QQCar implements Car
{
    @Override
    public void run()
    {
        System.out.println("qq car");
    }
}

3. Golang

3.1. 工厂

/*工厂接口*/
type CarFactory interface {
	CreateCar() Car
}

/*QQ车工厂*/
type QQCarFactory struct {

}

func (Q QQCarFactory) CreateCar() Car {
	return &QQCar{}
}


/*奥迪车工厂*/
type AodiCarFactory struct {

}

func (a AodiCarFactory) CreateCar() Car {
	return &AodiCar{}
}

3.2. 产品

/*汽车接口*/
type Car interface {
	Run()
}

/*QQ车*/
type QQCar struct {

}

func (Q QQCar) Run() {
	fmt.Println("QQ Car")
}

/*奥迪车*/
type AodiCar struct {

}

func (Q AodiCar) Run() {
	fmt.Println("Aodi Car")
}

3.3. client

func main() {
	RunCar(&工厂方法.QQCarFactory{})
	RunCar(&工厂方法.AodiCarFactory{})

}

func RunCar(factory 工厂方法.CarFactory)  {
	factory.CreateCar().Run()
}