• 设计模式之抽象工厂模式


    抽象工厂模式

    定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类

    通用场景:

    客户端(应用层)不依赖于产品类实例如何被创建、实现等细节

    强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码

    提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

    优点

    具体产品在应用层的代码隔离,无需关心创建的细节

    将一个系列的产品统一到一起创建

    缺点

    规定了所有可以被创建的产品集合,产品簇中扩展新的产品困难

    增加了系统的抽象性和理解难度

    IProductFactory接口

    public interface IProductFactory {
        //生产手机
        IphoneProduct iphoneProduct();
    
        //生成路由器
        IRouterProduct routerProduct();
    }
    

    hauweiFactory和xiaomiFactory实现这个接口

    public class HuaWeiFactory implements IProductFactory{
        @Override
        public IphoneProduct iphoneProduct() {
            return new HuaWeiPhone();
        }
    
        @Override
        public IRouterProduct routerProduct() {
            return new HuaweiRouter();
        }
    }
    
    
    public class XiaoMiFactory implements IProductFactory {
        @Override
        public IphoneProduct iphoneProduct() {
            return new XiaoMiPhone();
        }
    
        @Override
        public IRouterProduct routerProduct() {
            return new XiaoMiRouter();
        }
    }
    
    

    IphoneProduct手机接口

    public interface IphoneProduct {
        void start();
        void shutdown();
        void callUp();
        void send();
    
    }
    

    huawei手机和xiaomi手机都实现这个接口

    public class HuaWeiPhone implements IphoneProduct{
        @Override
        public void start() {
            System.out.println("开启华为手机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭华为手机");
        }
    
        @Override
        public void callUp() {
            System.out.println("华为手机打电话");
        }
    
        @Override
        public void send() {
            System.out.println("华为发短信");
        }
    }
    
    public class XiaoMiPhone implements IphoneProduct{
        @Override
        public void start() {
            System.out.println("开启小米手机");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭小米手机");
        }
    
        @Override
        public void callUp() {
            System.out.println("小米手机打电话");
        }
    
        @Override
        public void send() {
            System.out.println("小米发短信");
        }
    }
    

    路由器接口

    public interface IRouterProduct {
        void start();
        void shutdown();
        void openWifi();
        void setting();
    
    }
    

    xiaomi路由器和huawei路由器都实现这个接口

    public class XiaoMiRouter implements IRouterProduct{
        @Override
        public void start() {
            System.out.println("启动小米路由器");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭小米路由器");
        }
    
        @Override
        public void openWifi() {
            System.out.println("打开小米路由器wifi");
        }
    
        @Override
        public void setting() {
            System.out.println("小米路由器设置");
        }
    }
    
    public class HuaweiRouter implements IRouterProduct{
        @Override
        public void start() {
            System.out.println("启动华为路由器");
        }
    
        @Override
        public void shutdown() {
            System.out.println("关闭华为路由器");
        }
    
        @Override
        public void openWifi() {
            System.out.println("打开华为路由器wifi");
        }
    
        @Override
        public void setting() {
            System.out.println("华为路由器设置");
        }
    }
    

    测试

    public class Client {
        public static void main(String[] args) {
            System.out.println("====xiaomi====== ");
            XiaoMiFactory xiaoMiFactory = new XiaoMiFactory();
            IphoneProduct iphoneProduct = xiaoMiFactory.iphoneProduct();
            IRouterProduct iRouterProduct = xiaoMiFactory.routerProduct();
            iphoneProduct.send();
            iRouterProduct.openWifi();
        }
    }
    

    如果要新增一个笔记本,需要一个笔记本接口,然后在抽象产品工厂中约束,每个厂商的工厂都要加一个实现,每个厂商都多一个笔记本类

    抽象工厂模式在极其稳定的情况下很强大

    image-20220925165523129

    image-20220925171553812

  • 相关阅读:
    vue中diff算法原理
    【数据结构与算法】- 图(算法)
    idea中java版本设置
    如何用python写 翻译腔?天哪~这实在是太有趣了~
    MyBatis是如何执行一条SQL语句的
    BSP Day60
    进程之间是怎么协作的(互斥,同步)
    无人机新手防炸飞行技巧
    蓝桥杯入门(三)卡片
    chineseocr测试具体部署步骤(不用web界面)
  • 原文地址:https://blog.csdn.net/qq_46110710/article/details/127040977