zoukankan      html  css  js  c++  java
  • 设计模式——工厂模式

    工厂模式顾名思义就是创建产品,根据产品是具体产品还是具体工厂可以分为简单工厂模式和工厂方法模式,根据工厂的抽象程度,可以分为工厂方法模式和抽象工厂模式。该模式会用来封装和管理对象的创建。

    简单工厂模式

    该模式对对象创建管理方式最为简单,因为其仅仅简单的对不同对象的创建会进行波波的一层封装。
    Phone类:手机标准规范类(AbstractProduct)

    public interface Phone {
        void make();
    }
    

    MiPhone

    public class MiPhone implements Phone {
        public MiPhone() {
            this.make();
        }
        @Override
        public void make() {
            // TODO Auto-generated method stub
            System.out.println("make xiaomi phone!");
        }
    }
    

    IPhone 类:

    public class IPhone implements Phone {
        public IPhone() {
            this.make();
        }
        @Override
        public void make() {
            // TODO Auto-generated method stub
            System.out.println("make iphone!");
        }
    }
    

    PhoneFactory类:手机代工厂(Factory)

    public class PhoneFactory {
        public Phone makePhone(String phoneType) {
            if(phoneType.equalsIgnoreCase("MiPhone")){
                return new MiPhone();
            }
            else if(phoneType.equalsIgnoreCase("iPhone")) {
                return new IPhone();
            }
            return null;
        }
    }
    

    工厂方法模式


    这个工厂方法模式定义了一个抽象工厂,其定义了产品的生产接口,但是不负责具体的产品,将生产任务交给不同的派生工厂,这样不用通过制定类型来创建对象。

    AbstractFactory类:生产不同产品的工厂的抽象类

    public interface AbstractFactory {
        Phone makePhone();
    }
    

    XiaoMiFactory

    public class XiaoMiFactory implements AbstractFactory{
        @Override
        public Phone makePhone() {
            return new MiPhone();
        }
    }
    

    AppleFactory类:生产苹果手机的工厂(ConcreteFactory2)

    public class AppleFactory implements AbstractFactory {
        @Override
        public Phone makePhone() {
            return new IPhone();
        }
    }
    

    抽象工厂模式

    以上两种模式不管工厂如何抽象,都知识针对一类产品Phone, 如果要生成另一种PC,应该怎么表示呢?

    最简单的方式就是把 工厂方法模式完全复制一份,不过这次生成的是PC, 但同时也就意味着我们要复制和修改Phone 生产管理的所有代码,这显然是一个本方法,不利于扩展和维护。

    抽象工厂模式在AbstractFactory 中增加创建产品的接口,并在具体字工场中实现新加产品的创建,当然前提是子工厂支持生产该产品,否则继承这个接口可以什么都不干。

    PC 类:

    public interface PC {
        void make();
    }
    

    MiPC

    public class MiPC implements PC {
        public MiPC() {
            this.make();
        }
        @Override
        public void make() {
            // TODO Auto-generated method stub
            System.out.println("make xiaomi PC!");
        }
    }
    

    MAC类:定义苹果电脑产品(MAC)

    public class MAC implements PC {
        public MAC() {
            this.make();
        }
        @Override
        public void make() {
            // TODO Auto-generated method stub
            System.out.println("make MAC!");
        }
    }
    

    AbstractFactory类: 增加PC产品制造接口

    public interface AbstractFactory {
        Phone makePhone();
        PC makePC();
    }
    

    XiaoMiFactory: 增加小米PC 的制造

    public class XiaoMiFactory implements AbstractFactory{
        @Override
        public Phone makePhone() {
            return new MiPhone();
        }
        @Override
        public PC makePC() {
            return new MiPC();
        }
    }
    
    public class AppleFactory implements AbstractFactory {
        @Override
        public Phone makePhone() {
            return new IPhone();
        }
        @Override
        public PC makePC() {
            return new MAC();
        }
    }
    
  • 相关阅读:
    Java使用POI插件将数据以excel形式备份
    bzoj1611[Usaco2008 Feb]Meteor Shower流星雨*
    bzoj1603[Usaco2008 Oct]打谷机*
    bzoj1599[Usaco2008 Oct]笨重的石子*
    bzoj1230[Usaco2008 Nov]lites 开关灯*
    bzoj4002[JLOI2015]有意义的字符串
    bzoj1613[Usaco2007 Jan]Running贝茜的晨练计划*
    bzoj1602[Usaco2008 Oct]牧场行走*
    bzoj1715[Usaco2006 Dec]Wormholes 虫洞*
    bzoj2442[Usaco2011 Open]修剪草坪*
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/15260568.html
Copyright © 2011-2022 走看看