工厂模式(简单工厂、工厂方法)

来源:互联网 发布:影视制作软件app 编辑:程序博客网 时间:2024/04/30 15:45

工厂模式负责将大量有共同接口的类实例化,可以动态决定将哪个类实例化,主要有三种形态:
简单工厂模式:又称静态工厂方法模式;工厂方法模式:多态性工厂模式;抽象工厂模式:又称工具箱模式。
一、简单工厂模式
1. 工厂类角色:工厂方法模式的革新,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,往往由一个具体Java类实现。
2. 抽象产品角色:工厂方法模式所创建的对象的父类,或它们共同拥有的接口。可以用Java接口或者抽象类实现。
3. 具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品由一个具体的Java类实现。
抽象产品:

public interface Fruit {    public void plant();    public void harvest();}

具体产品:

public class Apple implements Fruit {    @Override    public void plant() {        System.out.println("apple plant");    }    @Override    public void harvest() {        System.out.println("apple harvest");    }}
public class Grape implements Fruit {    @Override    public void plant() {        System.out.println("grape plant");    }    @Override    public void harvest() {        System.out.println("grape harvest");    }}

工厂类

public class FruitFactory {    public static Fruit getFruit(String category){        if("apple".equals(category)){            return new Apple();        }else if("grape".equals(category)){            return new Grape();        }else{            return null;        }    }}

优点:模式的核心是工厂类,含有必要的逻辑判断,可以决定什么时候创建哪一个产品类的实例。而客户端免除直接创建产品对象的责任,而仅是消费产品,通过这种方式实现了责任的分割。
缺点:当产品类有复杂层级结构时,扩展起来比较麻烦。
二、工厂方法模式
工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建对象工作推迟到子类中。
1. 抽象工厂角色:工厂方法模式的核心,任何工厂类必须实现这个接口。这个角色常常使用抽象Java类实现。
2. 具体工厂角色:实现抽象工厂接口的具体Java类,含有密切相关的逻辑,受到 应用程序的调用以创建产品对象。具体的Java类实现。
3. 抽象产品角色:工厂方法模式所创建的对象的父类,或它们共同拥有的接口。可以用Java接口或者抽象类实现。
4. 具体产品角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品由一个具体的Java类实现。
抽象工厂

public interface FruitGardener {    public Fruit factory();}

具体工厂

public class AppleGardener implements FruitGardener{    @Override    public Fruit factory() {        return new Apple();    }}public class GrapeGardener implements FruitGardener {    @Override    public Fruit factory() {        return new Grape();    }}

抽象产品:

public interface Fruit {    public void plant();    public void harvest();}

具体产品:

public class Apple implements Fruit {    @Override    public void plant() {        System.out.println("apple plant");    }    @Override    public void harvest() {        System.out.println("apple harvest");    }}
public class Grape implements Fruit {    @Override    public void plant() {        System.out.println("grape plant");    }    @Override    public void harvest() {        System.out.println("grape harvest");    }}

优点:允许客户端相对独立于产品创建的过程,并且在系统引入新产品的时候无需修改客户端。
缺点:如果有新的产品加到系统中,需要修改工厂类,将必要逻辑加入到工厂类中。

0 0
原创粉丝点击