简单工厂模式

工厂模式

简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

可以看出,上面总共有三种类,一个是工厂类Creator,一个是产品接口IProduct,一个便是具体的产品,例如产品A和产品B,这之中,工厂类负责整个创建产品的逻辑判断,所以为了使工厂类能够知道我们需要哪一种产品,我们需要在创建产品时传递给工厂类一个参数,去表明我们想要创建哪种产品。将上面类图转化成代码如下:

public interface IProduct {

    public void method();
}
public class ProductA implements IProduct{

    public void method() {
        System.out.println("产品A方法");
    }

}
public class ProductB implements IProduct{

    public void method() {
        System.out.println("产品B方法");
    }

}
//工厂类
public class Creator {
    private Creator(){}
    
    public static IProduct createProduct(String productName){
        if (productName == null) {
            return null;
        }
        if (productName.equals("A")) {
            return new ProductA();
        }else if (productName.equals("B")) {
            return new ProductB();
        }else {
            return null;
        }
    }
}

以上是简单工厂模式,如果新增一个产品需要在工厂中增加一个if判断,这种也不是一种很好的解耦,在一下篇中的抽象工厂的设计模式中,将工厂也进一步抽象,让工厂只生产某一种产品;


工厂方法模式

对工厂的进一步抽象;

    可以看到工厂方法模式中定义了一个工厂接口,而具体的创建工作推迟到具体的工厂类,它是对简单工厂模式中的工厂类进一步抽象化,从而产生一个工厂类的抽象和实现体系,从而弥补简单工厂模式对修改开放的诟病。下面右半部分是产品抽象和实现体系,左半部分是工厂抽象和实现体系,其中工厂体系依赖于产品体系,每一个工厂负责创造一种产品,这就省去了简单工厂中的elseif判断,又客户端决定实例化一个特定的工厂去创建相应的产品。

抽象产品接口

public interface Light {

    public void turnOn();

    public void turnOff();
    
}

具体产品

public class BuldLight implements Light{

    public void turnOn() {
        System.out.println("BuldLight On");    
    }

    public void turnOff() {
        System.out.println("BuldLight Off");    
    }

}
public class TubeLight implements Light{

    public void turnOn() {
        System.out.println("TubeLight On");    
    }

    public void turnOff() {
        System.out.println("TubeLight Off");    
    }

}

抽象的工厂接口

public interface Creator {

    public Light createLight();
}

产品的具体工厂

public class BuldCreator implements Creator{

    public Light createLight() {
        return new BuldLight();
    }

}
public class TubeCreator implements Creator{

    public Light createLight() {
        return new TubeLight();
    }

}

测试类:

public class Client {

    public static void main(String[] args) {
        Creator creator = new BuldCreator();
        Light light = creator.createLight();
        light.turnOn();
        light.turnOff();
        
        creator = new TubeCreator();
        light = creator.createLight();
        light.turnOn();
        light.turnOff();
    }
}

输出结果:

    工厂方法模式弥补了简单工厂模式不满足开闭原则的诟病,当我们需要增加产品时,只需要增加相应的产品和工厂类,而不需要修改现有的代码。


抽象工厂模式

原文地址:https://www.cnblogs.com/crazytrip/p/6676989.html