工厂模式

定义

“Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.”(在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。)

  • 简单工厂(Simple Factory)模式,又称静态工厂方法模式(Static Factory Method Pattern)。
  • 工厂方法(Factory Method)模式,又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式;
  • 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。

为什么要用工厂模式

  1. 解耦 :把对象的创建和使用的过程分开;
  2. 降低代码重复: 如果创建某个对象的过程都很复杂,需要一定的代码量,而且很多地方都要用到,那么就会有很多的重复代码。
  3. 降低维护成本 :由于创建过程都Simple Factory)
    创建图形实例:
    首先是图形接口
public interface Shape {
    void draw();
}

创建实现类

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw a circle");
    }
}
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("draw an Rectangle");
    }
}

创建图形工厂

public class Factory {
    public static Shape getShape(Class<? extends Shape> clazz){
        Shape shape = null;
        try {
            shape = (Shape) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return shape;
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Shape circle = Factory.getShape(Circle.class);
        circle.draw();

        Shape rectangle = Factory.getShape(Rectangle.class);
        rectangle.draw();
    }
}

输出

draw a circle
draw an Rectangle

工厂方法(Factory Method)

工厂方法模式是简单工厂的仅一步深化, 在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的对象,而是针对不同的对象提供不同的工厂。也就是说 每个对象都有一个与之对应的工厂 。工厂方法模式应该是在工厂模式家族中是用的最多模式,一般项目中存在最多的就是这个模式。
创建工厂接口

public interface Factory {
    Shape getShape();
}

圆形工厂

public class CircleFactory implements Factory {
    @Override
    public Shape getShape() {
        return new Circle();
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        CircleFactory factory = new CircleFactory();
        Shape circle = factory.getShape();
        circle.draw();
    }
}

抽象工厂(Abstract Factory)

在工厂方法模式中,其实我们有一个潜在意识的意识。那就是我们生产的都是同一类产品。抽象工厂模式是工厂方法的仅一步深化,在这个模式中的工厂类不单单可以创建一种产品,而是可以创建一组产品。

创建抽象类

public interface Animal {
    public void catching();
}
public interface Food {
    public void cook();
}

创建实体类

public class Cattle implements Animal {
    @Override
    public void catching() {
        System.out.println("catching cattle...");
    }
}
public class Beef implements Food {
    @Override
    public void cook() {
        System.out.println("cooking beef...");
    }
}

创建工厂接口

public interface Factory {
    Food getFood();
    Animal catchingAnimal();
}

创建牛肉工厂

public class BeefFactroy implements Factory {
    @Override
    public Food getFood() {
        return new Beef();
    }
    @Override
    public Animal catchingAnimal() {
        return new Cattle();
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Factory AKFactory = new BeefFactroy();
        Animal bullet = AKFactory.catchingAnimal();
        Food food = AKFactory.getFood();
        bullet.catching();
        food.cook();
    }
}

输出

catching cattle...
cooking beef...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 工厂模式概述 意义 问题引出在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用...
    stoneyang94阅读 3,379评论 0 0
  • 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。通常我们所说的工厂模式是指工厂方法模...
    zfylin阅读 5,110评论 0 7
  • 目录: 一 工厂模式介绍 1.1 工厂模式的定义 1.2 工厂模式的分类: 1.3 在开源框架中的使用 1.4 为...
    xiaoyang08阅读 4,032评论 0 2
  • 起这个标题源自一个听众,他在听完我的故事后对我说,“姐,我在听到你的故事时觉得你太牛了,可你不说又有谁知道呢。”...
    潋烨阅读 1,722评论 0 0
  • 今天下午下班后老公说车快没油了,得去加油。但要去加油就没法在放学时准时接到女儿了,到时女儿肯定又要乱跑了。...
    一个普通的宝妈阅读 1,072评论 0 1