Java设计模式--工厂模式

来源:互联网 发布:面向对象java试题 编辑:程序博客网 时间:2024/06/17 19:44

简单工厂方法模式(别名:虚拟构造)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

Simple Factory Pattern(Another Name: Virtual Constructor)

Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.

类图

模式的结构与使用

工厂方法模式的结构中包括四个角色。
+ 抽象产品(Product):抽象类或接口,负责定义具体产品必须实现的方法。
+ 具体产品(Concrete Product):具体产品是一个类,如果Product是一个抽象类,那么具体产品是Product的子类;如果Product是一个接口,那么具体产品去实现接口。
+ 构造者(Creator):一个接口或者抽象类。构造者负责定义一个称作工厂方法的抽象方法,该方法返回具体产品类的实例。
+ 具体构造者(Concrete Creator):具体构造者重写工厂方法使该方法返回具体产品的实例。

简单的例子

Product的抽象类Animals.java

package virtualconstructor;public abstract class Animals {    String name;    public abstract void move();}

ConcreteProduct的实现类Dog.java

package virtualconstructor;public class Dog extends Animals{    public Dog() {        name = "狗";    }    public void move () {        System.out.println(name + "是走");    }}

ConcreteProduct的实现类Cat.java

package virtualconstructor;public class Cat extends Animals {    public Cat() {        name = "猫";    }    @Override    public void move() {        System.out.println(name + "是飞");    }}

Creator的抽象类Creator.java

package virtualconstructor;public abstract class Creator {    Animals animal;    public abstract Animals getAnimal();}

ConcreteCreator的实现类DogCreator.java

package virtualconstructor;public class DogCreator extends Creator {    @Override    public Animals getAnimal() {        return new Dog();    }}

ConcreteCreator的实现类CatCreator.java

package virtualconstructor;public class CatCreator extends Creator {    @Override    public Animals getAnimal() {        return new Cat();    }}

测试类Application.java

package virtualconstructor;public class Application {    public static void main(String[] args) {        DogCreator dog = new DogCreator();        dog.getAnimal().move();        CatCreator cat = new CatCreator();        cat.getAnimal().move();    }}

工厂模式的优点

  • 使用工厂模式可以让用户的代码和某个特定类的子类的代码解耦。
  • 工厂方法的使用用户不必知道它所使用的对象是怎么被创建的,只需要知道该对象有哪些方法即可。

适用工厂模式的情景

  • 用户需要一个类的子类的实例,但不希望与该类的子类形成耦合。
  • 用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。

下载源码请到

MyGitHub

0 0
原创粉丝点击