Java设计模式之工厂设计模式

一、简单工厂

/*
* 简单工厂(静态工厂)
* */

/*
* 抽象产品类
* */
interface CarProduct{
    /*
    * 抽象产品类的抽象方法show()。
    * */
    public void show();
}

/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
    public void show(){
        System.out.println("It is a BigCar");
    }
 }
 
 /*
 * 具体工厂类
 * */
class CarFacory{
    /*
    * 静态工厂方法。
    * 实例化一个BigCarProduct对象。
    * */
    public static BigCarProduct createBigCar(){
        return new BigCarProduct();
    }
}
public class FactoryDP {
    public static void main(String[] args) {
        BigCarProduct bigcar = CarFacory.createBigCar();
        bigcar.show();
    }
}
/*
* output:
* It is a BigCar
* */

二、工厂方法

/*
* 工厂方法模式
* */

/*
* 抽象产品类
* */
interface CarProduct{
    public void show();
}
/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
    @Override
    public void show() {
        System.out.println("It is a BigCar");
    }
}

/*
* 抽象工厂类
* */
interface CarFactory{
    public CarProduct createCar();
}

/*
* 具体工厂类
* */
class BigCarFactory implements CarFactory{
    @Override
    /*
    * 创建产品类方法
    * */
    public BigCarProduct createCar() {
        return new BigCarProduct();
    }
}

public class FactoryDP {
    public static void main(String[] args) {
      BigCarFactory bigCarFactory = new BigCarFactory();
      BigCarProduct bigCarProduct = bigCarFactory.createCar();
      bigCarProduct.show();
    }
}
/*
*output:
*It is a BigCar
*/

三、抽象工厂

/*
* 抽象工厂模式
* */

/*
* 抽象产品类
* */
interface CarProduct{
    public void show();
}

/*
* 具体产品类
* */
class BigCarProduct implements CarProduct{
    @Override
    public void show() {
        System.out.println("It is a BigCar");
    }
}
class SmartCarProduct implements CarProduct{
    @Override
    public void show() {
        System.out.println("It is a SmartCar");
    }
}

/*
* 抽象工厂类
* */
interface CarFactory{
    public CarProduct createBigCar();
    public CarProduct createSmartCar();
}

/*
* 具体工厂类
* */
class CarBothFactory implements CarFactory{
    /*
    * 创建产品类方法
    * */
    @Override
    public BigCarProduct createBigCar() {
        return new BigCarProduct();
    }
    @Override
    public SmartCarProduct createSmartCar() {
        return new SmartCarProduct();
    }
}
public class FactoryDP {
    public static void main(String[] args) {
     CarBothFactory carbothFactory =  new CarBothFactory();
     carbothFactory.createBigCar().show();
     carbothFactory.createSmartCar().show();
    }
}
/*
* output:
* It is a BigCar
*It is a SmartCar
* */

四、总结

上面介绍了三种工厂设计模式,其实当你仔细思考他们的原理时其实都是同一个思想,即将产品的生产和产品的获取解耦。

在上面的三种工厂模式中,对于用户来说,不需要知道BigCar与SmartCar是如何进行创建并进行相应配置的,他们只需要获取一个这种Car的工厂,然后调用工厂里的生产方法,即可得到相应的产品。这就是将两者解耦了,也消除了显式的实例化操作。

而这三者又有何区别呢?

1.简单工厂是静态工厂,所以他的生产产品的方法是静态的,在Java面向对象的语法中他自然的丧失了一部分特性,即动态绑定等,因为它属于类而不是对象。

2.工厂方法和抽象工厂其实没什么区别,你从代码中就可以看到,不同之处就在于它将一个产品再度的进行了分类,而那个用来分类的标准的术语叫做产品族,这里的产品族就是Big和Smart,当一个产品需要以一个或多个产品族进行分类时,你写的工厂方法自然就变成了抽象工厂。

猜你喜欢

转载自blog.csdn.net/a810373329/article/details/84752412