工厂模式

工厂模式:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂模式使一个类的实例化延迟到其子类。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

具体实例代码:https://gitee.com/binpowerbin/design_patterns.git

简单工厂

    在工厂使用的时候,根据参数来确定创建的对象,入实例代码中的图形创建,菜鸟教程中的工厂模式举例也是简单工厂

部分代码展示

public class FactoryPatternDemo {

    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        //获取 Circle 的对象,并调用它的 draw 方法
        Shape shape1 = shapeFactory.getShape("CIRCLE");

        //调用 Circle 的 draw 方法
        shape1.draw();

        //获取 Rectangle 的对象,并调用它的 draw 方法
        Shape shape2 = shapeFactory.getShape("RECTANGLE");

        //调用 Rectangle 的 draw 方法
        shape2.draw();

        //获取 Square 的对象,并调用它的 draw 方法
        Shape shape3 = shapeFactory.getShape("SQUARE");

        //调用 Square 的 draw 方法
        shape3.draw();
    }
}

简单工厂的不足:每当我想添加一种新的产品,就必然要修改工厂类,这显然违反了开闭原则,亦不可取;所以简单工厂只适合于产品对象较少,且产品固定的需求,对于产品变化无常的需求来说显然不合适。

工厂方法

定义:将工厂提取成一个接口或抽象类,具体生产什么产品由子类决定;
角色:抽象产品类、具体产品类、抽象工厂类、具体工厂类。
使用说明:和简单工厂一样,产品类抽象出来,这次我们把工厂类也抽象出来,生产什么样的产品由子类来决定;

部分代码展示

public class ClientDemo {

    public static void main(String[] args) {
        //创建一个苹果工厂
        FruitGardener fruitGardener = new AppleGardener();
        Fruit apple = fruitGardener.factory();
        apple.harvest();
        //创建一个葡萄工厂
        FruitGardener fruitGardener2 = new GrapeGardener();
        Fruit grape = fruitGardener2.factory();
        grape.harvest();
    }
}

 

工厂方法模式的缺点工厂方法和简单工厂相比,虽然实现了解耦,也遵循了开闭原则,但当产品非常多的时候,每次增加一个新产品,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。

还有一个抽象工厂,放在下一篇专门记录。

你可能感兴趣的:(#,创建型模式)