代码改变世界

设计模式-简单工厂模式

2014-04-12 00:39  VinpleZhang  阅读(185)  评论(0编辑  收藏  举报

传统创建对象,都是在客户端,通过A a=new A()的方式创建对象。现在可以将创建的职责转交给工厂类负责。

工厂模式主要有3种,一是简单工厂模式,二是工厂方法模式,三是抽象方法模式。这篇文章主要讲解简单工厂模式。

package cn.itcast_01;
/**
 * 
 * 这是一个抽象类
 * 里面有一个吃的功能
 *
 */

public abstract class Animal {
    
    public abstract void eat();

}

package cn.itcast_01;

public class Dog extends Animal {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("狗吃骨头");

    }

}

package cn.itcast_01;

public class Pig extends Animal {

    @Override
    public void eat() {
        // TODO Auto-generated method stub
        System.out.println("猪吃饲料");
    }
    

}

package cn.itcast_01;
/**
 * 
 * 提供一个动物工厂类
 *
 */

public class AnimalFactory {
    private AnimalFactory(){}
    
    /*
     * 写一个功能,返回一个Dog对象即可
     * 
     */
//    public static Dog createDog(){
//        //即使这个里面的创建对象很复杂,但是也不需要客户端来管理。
//        //这些复杂的事情都在工厂里给做好了    
//        return new Dog();            
//    }
//    public static Pig createPig(){
//        //即使这个里面的创建对象很复杂,但是也不需要客户端来管理。
//        //这些复杂的事情都在工厂里给做好了    
//        return new Pig();
//    }
    
    /**根据不同类型的字符串,来创建不同的对象
     * 
     * 
     */
    
    public static Animal createAnimal(String type){
        if("pig".equals(type)){
            return new Pig();
        }else if("dog".equals(type)){
            
            return new Dog();
        }
        return null;
        
    }
    
    
    
    
    
}



package cn.itcast_01;

public class AnimalTest {
    public static void main(String[] args) {

        // Pig p=AnimalFactory.createPig();
        // p.eat();
        //
        // Dog d=AnimalFactory.createDog();
        // d.eat();

        // 我们不能把父亲赋值给儿子。
        // 但是我们可以把儿子赋值给父亲。多态

        Animal a = AnimalFactory.createAnimal("dog");
        a.eat();

        a = AnimalFactory.createAnimal("pig");
        a.eat();

        // 开发中,针对对象,我们一般判断是否为null,如果不为null,才使用
        a = AnimalFactory.createAnimal("cat");
        if (a != null) {
            a.eat();
        }
    }
}

1.简单工厂模式
我现在有一个动物的继承体系
  Animal
   所有的动物都要吃饭
   |--Pig
   |--Dog
   当创建对象比较简单的时候,我们就可以直接在main方法里面做了,但是,很多时候,创建对象可能还需要做一些初始化,也就是说创建对象的操作会比较复杂,这个时候,如果所有对象的创建工作我们还是在main里面就不太合适,怎么解决这个问题呢?
  
  
   简单工厂优点和缺点:
   对象的创建比较复杂的时候,就考虑使用工厂来实现
 优点:再简单工厂模式中,客户端不再负责对象的创建,而把这个责任交给了工厂类
     客户端只负责对象的调用,从而明确了各个类的职责。(单一职责)    
  缺点:由于这个工厂类负责所有对象的创建,那么,当子类不断增多的时候,我们就需要去修改这个工厂的代码,这样呢,就违反一个原则:开闭原则。
  这个时候怎么办呢
 
  这个时候就用工厂方法模式改进。