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下功能相同,但是实现不同。也就是他们都有共同的约束条件:操作系统类型。

  • 相关阅读:
    Mysql5.6主从复制-基于binlog
    mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
    socket recv阻塞与非阻塞error总结
    linux socket talkclient talkserver示例
    linux-socket connect阻塞和非阻塞模式 示例
    OPENSSL FIPS
    epoll的LT和ET使用EPOLLONESHOT
    如何在socket编程的Tcp连接中实现心跳协议
    linux网络编程:splice函数和tee( )函数高效的零拷贝
    Linux网络编程--sendfile零拷贝高效率发送文件
  • 原文地址:https://www.cnblogs.com/zfc2201/p/3431910.html
Copyright © 2011-2022 走看看