zoukankan      html  css  js  c++  java
  • 23种设计模式之--抽象工厂模式

    女娲的失误:

    工厂方法模式中讲了女娲造人的故事。人是造出来了,世界也热闹了,可以低头一看,都是清一色的类型,

    缺少关爱、仇恨、喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办呢?

    八卦炉分为两个,一个用于造女人,一个用于造男人,有了性别,就有了爱情,也就有了丰富的人生。

    public interface Human
    {
        void getColor();
    
        void talk();
    
        void getSex();
    }
    
    public abstract class AbstractBlackHuman implements Human
    {
        public void getColor()
        {
            System.out.println( "black" );
        }
    
        public void talk()
        {
            System.out.println( "black human talking." );
        }
    }
    
    public abstract class AbstractWhiteHuman implements Human
    {
        public void getColor()
        {
            System.out.println( "white" );
        }
    
        public void talk()
        {
            System.out.println( "white human talking." );
        }
    }
    
    public abstract class AbstractYellowHuman implements Human
    {
        public void getColor()
        {
            System.out.println( "yellow" );
        }
    
        public void talk()
        {
            System.out.println( "yellow human talking." );
        }
    }
    
    public class MaleBlackHuman extends AbstractBlackHuman
    {
        public void getSex()
        {
            System.out.println( "male" );
        }
    }
    
    public class MaleWhiteHuman extends AbstractWhiteHuman
    {
        public void getSex()
        {
            System.out.println( "male" );
        }
    }
    
    public class MaleYellowHuman extends AbstractYellowHuman
    {
        public void getSex()
        {
            System.out.println( "male" );
        }
    }
    
    public class FemaleBlackHuman extends AbstractBlackHuman
    {
        public void getSex()
        {
            System.out.println( "female" );
        }
    }
    
    public class FemaleWhiteHuman extends AbstractWhiteHuman
    {
        public void getSex()
        {
            System.out.println( "female" );
        }
    }
    
    public class FemaleYellowHuman extends AbstractYellowHuman
    {
        public void getSex()
        {
            System.out.println( "female" );
        }
    }
    public interface HumanFactory
    {
        Human createBlackHuman();
    
        Human createWhiteHuman();
    
        Human createYellowHuman();
    }
    
    public class MaleFactory implements HumanFactory
    {
    
        public Human createBlackHuman()
        {
            return new MaleBlackHuman();
        }
    
        public Human createWhiteHuman()
        {
            return new MaleWhiteHuman();
        }
    
        public Human createYellowHuman()
        {
            return new MaleYellowHuman();
        }
    
    }
    
    public class FemaleFactory implements HumanFactory
    {
    
        public Human createBlackHuman()
        {
            return new FemaleBlackHuman();
        }
    
        public Human createWhiteHuman()
        {
            return new FemaleWhiteHuman();
        }
    
        public Human createYellowHuman()
        {
            return new FemaleYellowHuman();
        }
    
    }
    public class NvWa
    {
        public static void main( String[] args )
        {
            HumanFactory maleFactory = new MaleFactory();
            HumanFactory femaleFactory = new FemaleFactory();
    
            Human maleYellowHuman = maleFactory.createYellowHuman();
            Human femaleYellowHuman = femaleFactory.createYellowHuman();
    
            maleYellowHuman.getColor();
            maleYellowHuman.talk();
            maleYellowHuman.getSex();
    
            femaleYellowHuman.getColor();
            femaleYellowHuman.talk();
            femaleYellowHuman.getSex();
        }
    }

    定义:

    Provide an interface for creating families of related or dependent objects without specifying their concrete classes.

    为创建一组相关或相互依赖的对象提供一个接口。

    注意:有M个产品等级就应该有M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。

    优点:

    1.   封装性:每个产品的实现类不需要关心高层模块,只要知道工厂类是谁,就可以创建需要的产品。

    2.   产品族内的约束为非公开状态。

    缺点:

    1.产品族扩展非常困难。如果要增加一个产品c,抽象类AbstractCreator要增加一个方法createProductC(),然后两个实现类都要修改,这就违反了开闭原则。

    使用场景:

    一个对象族(或是没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如,一个文本编辑器在window下和在linux下功能相同,但是实现不同。也就是他们都有共同的约束条件:操作系统类型。

  • 相关阅读:
    Qt学习之路: 国际化(上)
    【Qt】测测你对Qt的了解–Qt工具知多少
    Scade 学习
    SCADESuite嵌入式软件基于模型的开发
    NeHe OpenGL教程 第四十四课:3D光晕
    NeHe OpenGL教程 第四十三课:FreeType库
    NeHe OpenGL教程 第四十二课:多重视口
    NeHe OpenGL教程 第四十一课:体积雾气
    NeHe OpenGL教程 第四十课:绳子的模拟
    78.员工个人信息保镖页面 Extjs 页面
  • 原文地址:https://www.cnblogs.com/zfc2201/p/3431910.html
Copyright © 2011-2022 走看看