zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    模式定义

    抽象工厂模式:提供一个创建一系列相关或相关依赖对象的接口,而无需指定他们具体的类,抽象工厂模式又被称为Kit模式,属于对象创建型模式。

    模式结构

    以window和linux的按钮和文本框为例

     模式分析

    优点:

    (1)抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建,在某种程度上,改变其工厂可以改变整个运行环境。

    (2)当一个 产品族中多个对象一起工作时,它能保证客户端只使用一个产品族对象。

    (3)符合开闭原则,增加新的具体工厂和产品族很方便。

    缺点:

    (1)在添加新的产品时,难以扩展抽象工厂来生产新种类的产品,针对抽象工厂的扩展,这将涉及到对抽象工厂角色及所有子类的修改,显然带来很多不便。

    电视空调案例

    TV接口类

    package com.zck.abstractfactory;
    
    public interface TV {
        public void play();
    }

    HaierTV类

    package com.zck.abstractfactory;
    
    public class HaierTV implements TV {
    
        public void play() {
            System.out.print("海尔电视正在播放
    ");
        }
    }

    TCLTV类

    package com.zck.abstractfactory;
    
    public class TCLTV implements TV {
    
        public void play() {
            System.out.print("TCL电视正在播放
    ");
        }
    }

    空调接口类

    package com.zck.abstractfactory;
    
    public interface AirConditioner {
        public void change();
    }

    海尔空调类

    package com.zck.abstractfactory;
    
    public class HaierAirConditioner implements AirConditioner {
    
        public void change() {
            System.out.print("海尔空调正在改变温度
    ");
        }
    
    }

    TCL空调类

    package com.zck.abstractfactory;
    
    public class TCLAirConditoner implements AirConditioner {
    
        public void change() {
            System.out.print("TCL空调正在改变温度
    ");
        }
    
    }

    工厂接口类

    package com.zck.abstractfactory;
    
    public interface Factory {
        public TV produceTV();
        public AirConditioner produceAirConditioner();
    }

    海尔工厂类

    package com.zck.abstractfactory;
    
    public class HaierFactory implements Factory {
    
        public TV produceTV() {
            return new HaierTV();
        }
    
        public AirConditioner produceAirConditioner() {
            return new HaierAirConditioner();
        }
    
    }

    TCL工厂类

    package com.zck.abstractfactory;
    
    public class TCLFactory implements Factory {
    
        public TV produceTV() {
            return new TCLTV();
        }
    
        public AirConditioner produceAirConditioner() {
            return new TCLAirConditoner();
        }
    
    }

    client测试类

    package com.zck.abstractfactory;
    
    public class Client {
        public static void main(String[] args) {
            Factory factory;
            TV tv;
            AirConditioner airConditioner;
            factory = new HaierFactory();
            tv = factory.produceTV();
            airConditioner = factory.produceAirConditioner();
            tv.play();
            airConditioner.change();
        }
    }

    测试结果

  • 相关阅读:
    前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>
    ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 。连属性都不能用
    你是否有遇到过某个实体类字段(属性)过多的情况,不想每次点的话戳进来(C# 反射)
    razor使用注意点........
    让简历在15秒内吸引招聘者《我的前程我做主》六
    JavaScript学习总结(十六)——Javascript闭包(Closure)
    C#操作XML的完整例子——XmlDocument篇(转载,仅做学习之用)
    C#操作XML方法集合
    图片超链接作为下载来处理
    架构师手记
  • 原文地址:https://www.cnblogs.com/2016-zck/p/13868169.html
Copyright © 2011-2022 走看看