zoukankan      html  css  js  c++  java
  • 无废话设计模式(1)--简单工厂、工厂方法、抽象工厂

    0-前言

      简单工厂、工厂方法、抽象工厂都是创建型的设计模式,三个设计模式都是工厂的变种,不复杂,下面我们来快速学习这三种;

    1-简单工厂模式

      太简单,UML图就不画了,直接上代码:

    //-----------------1、简单工厂------------
    //1-1、生产者父类
    class PhoneMaker
    {
        public void  getPhone(){}
    }
    //1-2、具体生产者
    class IphoneMaker extends PhoneMaker
    {
        @Override
        public void getPhone()
        {
            System.out.println("生产出了苹果手机");
        }
    }
    class HuaweiMaker extends PhoneMaker
    {
        @Override
        public void getPhone()
        {
            System.out.println("生产出了华为手机");
        }
    }
    
    //1-3 工厂
    class PhoneFactory
    {
        public  PhoneMaker makePhone(int phoneType)
        {
            PhoneMaker pm = null;
            switch (phoneType)
            {
                case 1:
                    pm=new IphoneMaker();
                    break;
                case 2:
                    pm=new HuaweiMaker();
                    break;
                default :
                        break;
    
            }
            return pm;
        }
    }

    客户端:

            //1、简单工厂模式
            PhoneFactory pf=new PhoneFactory();
            PhoneMaker pm = pf.makePhone(1);
            pm.getPhone();

    优缺点:

    优点
    (1)简单工厂包含必要的判断逻辑,简单工厂实现了对象的创建和使用的分离。
    (2)客户端无需知道所创建的具体产品类的类名,只需要具体产品类对应的参数即可!
    (3)在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性

    缺点
    (1)工厂类的职责过重,包含逻辑判断语句,它一旦有问题,整个系统都要出问题(2)在添加新的类的时候,简单工厂类就要修改,违反了开放——封闭原则!

    2-工厂方法模式

    同样,直接上代码:
    //----------------2、工厂方法模式---------------------
    //生产者接口
    interface ITVMaker
    {
        void getTV();
    }
    //工厂接口
    interface ITVFactory
    {
        ITVMaker getTVMaker();
    }
    
    //----------------
    //具体生产者
    class AppleTVMaker implements ITVMaker
    {
        @Override
        public void getTV()
        {
            System.out.println("生产出了苹果电视");
        }
    }
    class  HuaweiTVMaker implements ITVMaker
    {
        @Override
        public void getTV()
        {
            System.out.println("生产出了华为电视");
        }
    }
    //具体工厂
    class AppleTVFactory implements  ITVFactory
    {
        @Override
        public ITVMaker getTVMaker()
        {
            return new AppleTVMaker();
        }
    }
    class HuaweiTVFactory implements ITVFactory
    {
        @Override
        public ITVMaker getTVMaker()
        {
            return new HuaweiTVMaker();
        }
    }

    客户端:

            //2、工厂方法模式
            //如果要苹果电视
            ITVFactory  tvf = new AppleTVFactory();
            ITVMaker tvm = tvf.getTVMaker();
            tvm.getTV();
            //如果要华为电视
            // ITVFactory  tvf = new HuaweiTVFactory();

    优缺点:

    优点:
    (1)工厂方法用来创建客户所需要的产品,同时隐藏了哪种具体产品类将被实例化的细节,用户只需要要关注工厂,不需要关注创建的细节!
    (2)在增加修改新的产品的时候不用修改代码,只需要增加对应的工厂就好,完全符合开放——封闭性原则!
    (3)创建对象的细节完全封装在具体的工厂内部,而且有了抽象的工厂类,所有的具体工厂都继承了自己的父类!完美的体现了多态性!

    缺点:
    (1)在增加新的产品时,也必须增加新的工厂类,会带来额外的开销

    3-抽象工厂模式

    同样,直接上代码:
    //--------------------3、抽象工厂模式--------------
    //产品接口
    class BookMaker //产品1
    {
        public void makeBook()
        {}
    }
    class  PenMaker //产品2
    {
        public void makePen()
        {}
    }
    //工厂接口
    interface IstudentFactory
    {
        BookMaker CreateBookmaker();
        PenMaker CreatPenkmaker();
    }
    //------实现具体产品
    class MinBookMaker extends BookMaker
    {
        @Override
        public void makeBook()
        {
            System.out.println("生产了小学课本");
        }
    }
    class  MinPenMaker extends PenMaker
    {
        @Override
        public void makePen()
        {
            System.out.println("生产了小学生用的笔");
        }
    }
    //  。。。。。产品1234...
    //具体工厂
    class  MinStudentFactory implements IstudentFactory
    {
        @Override
        public BookMaker CreateBookmaker()
        {
            return  new MinBookMaker();
        }
    
        @Override
        public PenMaker CreatPenkmaker()
        {
            return  new MinPenMaker();
        }
    }
    //......工厂1234.....

    客户端:

    //3、抽象工厂
            IstudentFactory factory = new MinStudentFactory(); //生产小学生的产品系列
            BookMaker bookMaker = factory.CreateBookmaker();
            PenMaker penMaker =factory.CreatPenkmaker();
            bookMaker.makeBook();
            penMaker.makePen();
         //...生产中学生的系列产品.....
         //
    IstudentFactory factory = new MiddleStudentFactory();
    //----- 3.1 以下是配合反射的抽象工厂------
            String studentType="Min";
            try
            {
               // Class<?> c =Class.forName(this.getClass().getPackage().getName() + studentType + "StudentFactory");
                Class<?> c =Class.forName("com.anson.designpattern.designPattern.MinStudentFactory");
                IstudentFactory studentFactory = (IstudentFactory)c.newInstance();
                BookMaker bookMaker1 = studentFactory.CreateBookmaker();
                PenMaker penMaker1 =studentFactory.CreatPenkmaker();
                bookMaker1.makeBook();
                penMaker1.makePen();
            }
            catch (Exception e)
            {
                System.out.println(e);
            }

    优缺点:

    增加一个产品族很简单,而增加一个新的产品就会非常复杂!

    4-一句话总结

    简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
    工厂方法 : 用来生产同一等级结构中的固定产品。(支持增加任意产品)
    抽象工厂 : 用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
    ****** 真性情的程序汪一枚,踏实做事,乐观做人!******
    作者: 大叔杨
    QQ :59079961
    版权声明:本文版权归作者和博客园共有,欢迎转载,尊重劳动成果,转载请保留出处和原文链接。
  • 相关阅读:
    中值定理
    poj 3984 迷宫问题 bfs
    android 处理网络状态——无网,2g,3g,wifi,ethernet,other
    POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
    Android硬件加速
    Android的横竖屏切换
    滑雪_poj_1088(记忆化搜索).java
    Rank of Tetris(hdu1811拓扑排序+并查集)
    git在windows下clone、pull或者push内存溢出的解决办法
    数据库中DDL、DML、DCL和TCP概念
  • 原文地址:https://www.cnblogs.com/yanghj/p/13408679.html
Copyright © 2011-2022 走看看