创建实例的“新姿势”,使用工厂模式代替构造器

一、简单工程模式

        简单工厂模式又叫做静态工厂方法模式

        内容:由一个工厂对象决定创建出哪一种产品类的实例。

        特点:一个工厂对象只生产一个所对应的实例。

        优点:使用非常简单

        缺点:扩展比较困难,不符合开闭原则

        例如下面的例子:女娲通过八卦炉生产出各式各样的人类,这个过程考虑用简单工厂模式实现。类图如下:

        

public class HumanFactory {
     
    public static <T extends Human> T createHuman(Class<T> c) {
             
        //定义一个生产出的人种
             
        Human human = null;
             
        try {
                     
            //产生一个人种
                    
            human = (Human)Class.forName(c.getName()).newInstance();
             
        } catch (Exception e) {
                    
            System.out.println("人种生成错误!");
             
        }
            
        return (T)human;
     
    }

}

         产生一个产品对象的方法,非常简单,直接调用简单工厂中的对应方法即可。

Human whiteHuman = HumanFactory.createHuman(WhiteHuman.class);


二、工厂方法模式

        工厂方法模式弥补了简单工厂模式的不足,它符合开闭原则

        内容:创建产品对象的工厂接口,将实际创建工作推迟到子类当中。

        特点:将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成,即由子类来决定应该实例化(创建)哪一个类。

        优点:

  • 良好的封装性,代码结构清晰

        调用者需要创建一个产品对象,只需要知道产品的类名就可以了。并且调用者不用关心产品类如何变化,只需要关心产品的接口,只要接口不变,系统的上层模块就不会发生变化。

  • 扩展性非常优秀

        只需要适当修改具体的工厂类或扩展一个工厂类,就可以增加产品了。

        注意:工厂方法符合开闭原则、迪米特法则、依赖倒转原则、里式替换原则

        还是上面的例子,考虑用工厂方法模式实现。类图如下:

        

public abstract class AbstractHumanFactory {
     
    public abstract <T extends Human> T createHuman(Class<T> c);

}

public class HumanFactory extends AbstractHumanFactory {
     
    public <T extends Human> T createHuman(Class<T> c) {
             
        //定义一个生产的人种
             
        Human human=null;
             
        try {
                      
            //产生一个人种
                      
            human = (T)Class.forName(c.getName()).newInstance();

        } catch (Exception e) {
                  
            System.out.println("人种生成错误!");
             
        }
             
        return (T)human;
     
    }

}

         当需要生产一个产品对象时,只需要首先创建出对应的工厂,然后通过工厂再生产产品即可。

AbstractHumanFactory factory = new HumanFactory();

Human whiteHuman = factory.createHuman(WhiteHuman.class);


 

三、抽象工厂模式

        抽象工厂模式是工厂方法模式的升级版本。

        内容:创建产品对象的工厂接口,无需指定所创建产品的具体类。

        特点:无需指定所创建产品的具体实现类。

        优点:

  • 良好的封装性

        高层模块不需要关心每个产品的具体实现类,只需要知道工厂类是谁,就能创建一个需要的对象。

  • 产品族内的约束为非公开的状态

        具体的产品族内的约束是在工厂内实现的。

        缺点:

        扩展非常困难,不符合开闭原则。

        还是之前的例子,这次稍微扩展一下,增加一个性别属性,考虑使用抽象工厂模式实现。类图如下:

        

public abstract class AbstractWhiteHuman implements Human {
     
    //白色人种的皮肤颜色是白色的
     
    public void getColor() {
             
        System.out.println("白色人种的皮肤颜色是白色的!");
     
    }
     
    //白色人种讲话
     
    public void talk() {
             
        System.out.println("白色人种会说话,一般说的都是单字节。");
     
    }
}

AbstractBlackHuman、AbstractYellowHuman略  
public class MaleWhiteHuman extends AbstractWhiteHuman {
     
    //白人男性
     
    public void getSex() {
             
        System.out.println("白人男性");
     
    }

}

FemaleBlackHuman、MaleBlackHuman、FemaleYellowHuman、MaleYellowHuman略
public interface HumanFactory {
     
    //制造一个黄色人种
     
    public Human createYellowHuman();
     
    //制造一个白色人种
     
    public Human createWhiteHuman();
     
    //制造一个黑色人种
     
    public Human createBlackHuman();

}

public class MaleFactory implements HumanFactory {
     
    //生产出黑人男性
     
    public Human createBlackHuman() {
             
        return new MaleBlackHuman();
     
    }
     
    //生产出白人男性
     
    public Human createWhiteHuman() {
             
        return new MaleWhiteHuman();
     
    }
     
    //生产出黄人男性
     
    public Human createYellowHuman() {
             
        return new MaleYellowHuman();
     
    }
}

FeMaleFactory略

        最终我们以生产一个白人男性为例。生产过程如下:

HumanFactory maleHumanFactory = new MaleFactory();

Human maleWhiteHuman = maleHumanFactory.createWhiteHuman();
发布了67 篇原创文章 · 获赞 69 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34519487/article/details/104254784