A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

xiezilong

黑马粉丝团

  • 黑马币:30

  • 帖子:11

  • 精华:0

© xiezilong 黑马粉丝团   /  2018-11-9 15:41  /  711 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

工厂方法模式  
一、  为什么要使用工厂方法模式
    上一期我们讲解了简单工厂模式,但是简单工厂模式的缺点如下:
简单工厂模式把生产对象的功能放在一个类上,如果是在添加一个新种类,必然会导致工厂类的修改,在实际开发中写好的类一般不允许打开修改。只允许在
原来的基础上添加类。因此要使用工厂方法模式进行改进。
二、工厂方法模式概述
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。
三、工厂方法模式具体实现步骤(创建动物为例)
   第1步、创建接口Animal
   public interface Animal {       
          public void eat();
  }
   第2步、创建一个实现类Cat、Dog
     public class Cat implements Animal {
             public void eat() {
                   System.out.println("猫吃鱼");
           }
    }

public class Dog implements Animal {
        public void eat() {
                System.out.println("狗吃骨头");
        }
}


第3步、之前设计的简单工厂模式如下:
public class AnimalFactory {
        public static  Animal  createAnimal  (String type){        Animal  animal  =null;//声明一个父类对象
                //根据参数判断有生产什么对象
                if ("cat".equals(type)) {
                                        animal  =new Cat();
                                }else if ("bus".equals(type)) {
                                        animal  =new Dog();
                                }
                                return animal;       
                }
}
      这种实现把生产对象的功能放在一个AnimalFactory 类上,如果是在添加一个新的的种类Tiger,必然会引起AnimalFactory内部的修改。这就违反了面向对象的设计原则——开闭原则。使用工厂方法模式改进如下:
1、把AnimalFactory 进一步抽象写成一个接口,AnimalFactory 中创建动物的方法是抽象方法。这个时候可以把AnimalFactory 理解一个大厂,这个大厂只是规定要要生产动物,但是不具体生产。
接口:AnimalFactory
public interface AnimalFactory {       
    public   Animal  createAnimal();
}
2、生产不同的动物建可以立不同的具体工厂比如CatFactory ,就相当于在大厂的基础上建立不同的分厂,每个分厂生产不同的产品
建立生产猫的分厂类CatFactory
public class CatFactory implements AnimalFactory {
        public Animal createAnimal() {
                // TODO Auto-generated method stub
                return new Cat();
        }
}
建立生产狗的分厂类DogFactory
public class DogFactory implements AnimalFactory {
        public Animal createAnimal() {
                return new Dog();
        }
}
    以上的好处:如果需要创建一个新的对象Tiger,只要添加一个Tiger类和一个创建Tiger的分厂类。不要修改任何代码。
public class Test {
        public static void main(String[] args) {
                //要想创建猫,首先创建猫工厂,在生产猫对象
                //创建猫工厂
                AnimalFactory animalFactory=new CatFactory();
                //创建猫
                Animal cat=animalFactory.createAnimal();               
                cat.eat();
        }
  }
  

四、工厂方法模式的缺点
   使用工厂方法模式创建新的动物种类的时候,不要修改任何代码,只需要添加类。但是我们发现当动物的种类非常多时,会出现大量的与之对应的工厂对象,增加的很多的代码。这不是我们所希望的,因此下期继续改进。


3 个回复

倒序浏览
很好!!
回复 使用道具 举报
不错,加油!
回复 使用道具 举报
非常给力!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马