Java - 工厂方法模式

-- 工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。

一、模式结构

组成(角色) 关系 作用
抽象产品(Product) 具体产品的父类 描述具体产品的公共接口
具体产品(Concrete Product) 抽象产品的子类;工厂类创建的目标类 描述生产的具体产品
抽象工厂(Creator) 具体工厂的父类 描述具体工厂的公共接口
具体工厂(Concrete Creator) 抽象工厂的子类;被外界调用 描述具体工厂;实现FactoryMethod工厂方法创建产品的实例

二、结构栗子

(1)、抽象产品-水果Fruit

(2)、具体产品-苹果Apple、雪梨Peer、香蕉Banana

(3)、抽象工厂-水果工厂

(4)、具体工厂-苹果工厂、雪梨工厂、香蕉工厂

三、工厂方法模式优缺点

1、优点

  • 符合ocp开放封闭原则
  • 解决了简单工厂的部分缺点、例如静态工厂方法、每个具体工厂只负责自己部分。

2、缺点

  • 新建许多类,增加系统复杂性。
  • 增加系统编译和运行的开销。

四、栗子

1、抽象产品

package com.FactoryMode_02;

/**
 * @description: 抽象产品角色-水果
 * @author: ziHeng
 * @create: 2018-08-02 14:31
 **/
public interface Fruit {

    void get();

}

2、具体产品

(1)、苹果

package com.FactoryMode_02;

/**
 * @description: 具体产品角色-苹果
 * @author: ziHeng
 * @create: 2018-08-02 14:30
 **/
public class Apple implements Fruit{

    public void get(){
        System.out.println("得到苹果");
    }

}

(2)、香蕉

package com.FactoryMode_02;

import com.FactoryMode_02.Fruit;

/**
 * @description: 具体产品角色-香蕉
 * @author: ziHeng
 * @create: 2018-08-02 14:31
 **/
public class Banana implements Fruit {

    public void get(){
        System.out.println("得到香蕉");
    }

}

3、抽象工厂-水果工厂

package com.FactoryMode_02;

/**
 * @description: 工厂角色-水果工厂
 * @author: ziHeng
 * @create: 2018-08-02 14:32
 **/
public interface FruitFactory {

    Fruit getFruit();

}

4、具体工厂

(1)、苹果

package com.FactoryMode_02;

/**
 * @description: 具体产品角色-苹果
 * @author: ziHeng
 * @create: 2018-08-02 14:30
 **/
public class Apple implements Fruit{

    public void get(){
        System.out.println("得到苹果");
    }

}

(2)、香蕉

package com.FactoryMode_02;

import com.FactoryMode_02.Fruit;

/**
 * @description: 具体产品角色-香蕉
 * @author: ziHeng
 * @create: 2018-08-02 14:31
 **/
public class Banana implements Fruit {

    public void get(){
        System.out.println("得到香蕉");
    }

}

调用Test类:

package com.FactoryMode_02;

/**
 * @description: 调用者
 * @author: ziHeng
 * @create: 2018-08-02 14:35
 **/
public class Test {

    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        //多态 向上转型 创建各实例工厂
        FruitFactory appleFactory = new AppleFactory();
        FruitFactory bananaFactory = new BananaFactory();
        //调用工厂方法
        appleFactory.getFruit().get();
        bananaFactory.getFruit().get();
        
        /*
          若要增加新的水果实例
          添加新的具体角色和具体工厂  
         */
        
    }

}

你可能感兴趣的:(Java设计模式-创建型,Java,创建型)