wordpress怎样加入代码,洛阳做网站优化,跨境电商亚马逊,南昌市建设规费标准网站目录
1. 概述
2. 创建型模式
2.1 简单#xff08;静态#xff09;工厂模式
2.1.1 介绍
2.1.2 实现
2.2 工厂模式
2.3 抽象工厂模式
2.4 单例模式
2.4.1 饿汉模式
2.4.2 懒汉模式
2.4.3 线程安全的懒汉式
2.4.4 DCL单例 - 高性能的懒汉式
2.5 建造者模式
2.6 原…目录
1. 概述
2. 创建型模式
2.1 简单静态工厂模式
2.1.1 介绍
2.1.2 实现
2.2 工厂模式
2.3 抽象工厂模式
2.4 单例模式
2.4.1 饿汉模式
2.4.2 懒汉模式
2.4.3 线程安全的懒汉式
2.4.4 DCL单例 - 高性能的懒汉式
2.5 建造者模式
2.6 原型模式
2.7 创建型模式总结 1. 概述
设计模式(Design Pattern)是前辈们经过相当长的一段时间的试验和错误总结出来的是软件开发过程中面临的通用问题的解决方案。这些解决方案使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式的优点
① 可以提高程序员的思维能力、编程能力和设计能力。② 使程序设计更加标准化、代码编制更加工程化使软件开发效率大大提高从而缩短软件的开发周期。③ 使设计的代码可重用性高、可读性强、可靠性高、灵活性好、可维护性强。 有一些重要的设计原则在开篇和大家分享下这些原则将贯通全文
针对接口编程而不是针对实现编程。这个很重要也是优雅的、可扩展的代码的第一步。职责单一原则。每个类都应该只有一个单一的功能并且该功能应该由这个类完全封装起来。对修改关闭对扩展开放。对修改关闭是说我们辛辛苦苦加班写出来的代码该实现的功能和该修复的 bug 都完成了别人可不能说改就改对扩展开放就比较好理解了也就是说在我们写好的代码基础上很容易实现扩展。
设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结其中最出名的当属 Gang of FourGoF的分类了他们将设计模式分类为 23 种经典的模式根据用途我们又可以分为三大类分别为创建型模式5种、结构型模式7种和行为型模式11种。
1创建型模式
简单静态工厂模式一个工厂类根据传入的参量决定创建出那一种产品类的实例。该模式不属于23种GOF设计模式之一工厂方法定义一个创建对象的接口让子类决定实例化那个类。抽象工厂创建相关或依赖对象的家族而无需明确指定具体类。单例模式某个类只能有一个实例提供一个全局的访问点。 饿汉模式懒汉模式建造者模式封装一个复杂对象的构建过程并可以按步骤构造。原型模式通过复制现有的实例来创建新的实例。
2结构型模式
外观模式对外提供一个统一的方法来访问子系统中的一群接口。桥接模式将抽象部分和它的实现部分分离使它们都可以独立的变化。组合模式将对象组合成树形结构以表示“”部分-整体“”的层次结构。装饰模式动态的给对象添加新的功能。代理模式为其他对象提供一个代理以便控制这个对象的访问。适配器模式将一个类的方法接口转换成客户希望的另外一个接口。亨元蝇量模式通过共享技术来有效的支持大量细粒度的对象。
3行为型模式
模板模式定义一个算法结构而将一些步骤延迟到子类实现。解释器模式给定一个语言定义它的文法的一种表示并定义一个解释器。策略模式定义一系列算法把他们封装起来并且使它们可以相互替换。状态模式允许一个对象在其对象内部状态改变时改变它的行为。观察者模式对象间的一对多的依赖关系。备忘录模式在不破坏封装的前提下保持对象的内部状态。中介者模式用一个中介对象来封装一系列的对象交互。命令模式将命令请求封装为一个对象使得可以用不同的请求来进行参数化。访问者模式在不改变数据结构的前提下增加作用于一组对象元素的新功能。责任链模式将请求的发送者和接收者解耦使的多个对象都有处理这个请求的机会。迭代器模式一种遍历访问聚合对象中各个元素的方法不暴露该对象的内部结构。
2. 创建型模式
创建型模式的作用就是创建对象说到创建一个对象最熟悉的就是 new 一个对象然后 set 相关属性。但是在很多场景下我们需要给客户端提供更加友好的创建对象的方式尤其是那种我们定义了类但是需要提供给其他开发者用的时候。
2.1 简单静态工厂模式
2.1.1 介绍
① 一句话来说就是一个工厂类根据传入的参量决定创建出那一种产品类的实例。因为逻辑实现简单所以称为简单工厂模式也因为工厂中的方法一般设置为静态所以也称为静态工厂它不属于23种模式。
② 简单工厂模式专门定义一个工厂类来负责创建其他类的实例被创建的实例通常都具有共同的父类在工厂类中可以根据参数的不同返回不同类的实例。升级版本简单工厂模式通过反射根据类的全路径名生成对象。
③ 简单工厂模式就是将这部分创建对象语句分离出来由工厂类来封装实例化对象的行为修改时只需要修改类中的操作代码使用时调用该类不需要考虑实例化对象的行为使得后期代码维护升级更简单方便有利于代码的可修改性与可读性。
④ 但是如果增加新的产品的话需要修改工厂类的判断逻辑违背开闭原则。
2.1.2 实现
直接上代码
public class FoodFactory {public static Food makeFood(String name) {if (name.equals(noodle)) {Food noodle new LanZhouNoodle();noodle.addSpicy(more);return noodle;} else if (name.equals(chicken)) {Food chicken new HuangMenChicken();chicken.addCondiment(potato);return chicken;} else {return null;}}
}
其中LanZhouNoodle 和 HuangMenChicken 都继承自 Food。
简单地说简单工厂模式通常就是这样一个工厂类 XxxFactory里面有一个静态方法根据我们不同的参数返回不同的派生自同一个父类或实现同一接口的实例对象。
我们强调职责单一原则一个类只提供一种功能FoodFactory 的功能就是只要负责生产各种 Food。
2.2 工厂模式
简单工厂模式很简单如果它能满足我们的需要我觉得就不要折腾了。之所以需要引入工厂模式是因为我们往往需要使用两个或两个以上的工厂。
public interface FoodFactory {Food makeFood(String name);
}
public class ChineseFoodFactory implements FoodFactory {Overridepublic Food makeFood(String name) {if (name.equals(A)) {return new ChineseFoodA();} else if (name.equals(B)) {return new ChineseFoodB();} else {return null;}}
}
public class AmericanFoodFactory implements FoodFactory {Overridepublic Food makeFood(String name) {if (name.equals(A)) {return new AmericanFoodA();} else if (name.equals(B)) {return new AmericanFoodB();} else {return null;}}
}
其中ChineseFoodA、ChineseFoodB、AmericanFoodA、AmericanFoodB 都派生自 Food。
客户端调用
public class APP {public static void main(String[] args) {// 先选择一个具体的工厂FoodFactory factory new ChineseFoodFactory();// 由第一步的工厂产生具体的对象不同的工厂造出不一样的对象Food food factory.makeFood(A);}
}
虽然都是调用 makeFood(A) 制作 A 类食物但是不同的工厂生产出来的完全不一样。
第一步我们需要选取合适的工厂然后第二步基本上和简单工厂一样。
核心在于我们需要在第一步选好我们需要的工厂。比如我们有 LogFactory 接口实现类有 FileLogFactory 和 KafkaLogFactory分别对应将日志写入文件和写入 Kafka 中显然我们客户端第一步就需要决定到底要实例化 FileLogFactory 还是 KafkaLogFactory这将决定之后的所有的操作。
虽然简单不过我也把所有的构件都画到一张图上这样看着比较清晰 2.3 抽象工厂模式
当涉及到产品族的时候就需要引入抽象工厂模式了。
一个经典的例子是造一台电脑。我们先不引入抽象工厂模式看看怎么实现。
因为电脑是由许多的构件组成的我们将 CPU 和主板进行抽象然后 CPU 由 CPUFactory 生产主板由 MainBoardFactory 生产然后我们再将 CPU 和主板搭配起来组合在一起如下图 这个时候的客户端调用是这样的
// 得到 Intel 的 CPU
CPUFactory cpuFactory new IntelCPUFactory();
CPU cpu intelCPUFactory.makeCPU();// 得到 AMD 的主板
MainBoardFactory mainBoardFactory new AmdMainBoardFactory();
MainBoard mainBoard mainBoardFactory.make();// 组装 CPU 和主板
Computer computer new Computer(cpu, mainBoard);
单独看 CPU 工厂和主板工厂它们分别是前面我们说的工厂模式。这种方式也容易扩展因为要给电脑加硬盘的话只需要加一个 HardDiskFactory 和相应的实现即可不需要修改现有的工厂。
但是这种方式有一个问题那就是如果 Intel 家产的 CPU 和 AMD 产的主板不能兼容使用那么这代码就容易出错因为客户端并不知道它们不兼容也就会错误地出现随意组合。
下面就是我们要说的产品族的概念它代表了组成某个产品的一系列附件的集合 当涉及到这种产品族的问题的时候就需要抽象工厂模式来支持了。我们不再定义 CPU 工厂、主板工厂、硬盘工厂、显示屏工厂等等我们直接定义电脑工厂每个电脑工厂负责生产所有的设备这样能保证肯定不存在兼容问题。 这个时候对于客户端来说不再需要单独挑选 CPU厂商、主板厂商、硬盘厂商等直接选择一家品牌工厂品牌工厂会负责生产所有的东西而且能保证肯定是兼容可用的。
public static void main(String[] args) {// 第一步就要选定一个“大厂”ComputerFactory cf new AmdFactory();// 从这个大厂造 CPUCPU cpu cf.makeCPU();// 从这个大厂造主板MainBoard board cf.makeMainBoard();// 从这个大厂造硬盘HardDisk hardDisk cf.makeHardDisk();// 将同一个厂子出来的 CPU、主板、硬盘组装在一起Computer result new Computer(cpu, board, hardDisk);
}
当然抽象工厂的问题也是显而易见的比如我们要加个显示器就需要修改所有的工厂给所有的工厂都加上制造显示器的方法。这有点违反了对修改关闭对扩展开放这个设计原则。
2.4 单例模式
2.4.1 饿汉模式
饿汉模式最简单
public class Singleton {/*** static* ①表示共享变量语意符合* ②使得该变量能在getInstance()静态方法中使用* final:* ①final修饰的变量值不会改变即常量语意也符合当然不加final也是可以的* ②保证修饰的变量必须在类加载完成时就已经进行赋值。* final修饰的变量前面一般加static*/private static final Singleton singleton new Singleton();/*** 私有化构造方法使外部无法通过构造方法构造除singleton外的类实例* 从而达到单例模式控制类实例数目的目的*/private Singleton(){}/*** 类实例的全局访问方法* 因为构造方法以及被私有化外部不可能通过new对象来调用其中的方法* 加上static关键词使得外部可以通过类名直接调用该方法获取类实例* return*/public static Singleton getSingleton() {return singleton;}
}
说明
① 优点一般使用static和final修饰变量具体作用已经在代码里描述了只在类加载时才会初始化以后都不会线程绝对安全无锁效率高。
② 缺点类加载的时候就初始化不管用不用都占用空间会消耗一定的性能(当然很小很小几乎可以忽略不计所以这种模式在很多场合十分常用而且十分简单)。
2.4.2 懒汉模式
public class Singleton {private static Singleton singleton null;private Singleton(){}public static Singleton getSingleton() {if(singleton null){singleton new Singleton();}return singleton;}
}
说明
① 优点在外部需要使用的时候才进行实例化不使用的时候不会占用空间。
② 缺点线程不安全。看上去这段代码没什么明显问题但它不是线程安全的。假设当前有N个线程同时调用getInstance方法由于当前还没有对象生成所以一部分同时都进入if语句new Singleton()那么就会由多个线程创建多个多个user对象。
2.4.3 线程安全的懒汉式
public class Singleton {private static Singleton singleton;private Singleton(){};private static synchronized Singleton getSingleton(){if(singleton null){singleton new Singleton();}return singleton;}
}
说明
① 优点解决了懒汉式线程不安全的问题
② 缺点线程阻塞影响性能。
2.4.4 DCL单例 - 高性能的懒汉式
public class Singleton {/*volatile在这里发挥的作用是禁止指令重排序编译器和处理器为了优化程序性能* 而对指令序列进行排序的一种手段。* singleton new Singleton();这句代码是非原子性操作可分为三行伪代码* a:memory allocate() //分配内存在jvm堆中分配一段区域* b:ctorInstanc(memory) //初始化对象在jvm堆中的内存中实例化对象* c:instance memory //赋值设置instance指向刚分配的内存地址* 上面的代码在编译运行时可能会出现重排序从a-b-c排序为a-c-b。* 重排序是为了优化性能但是不管怎么重排序在单线程下程序的执行结果不能被改变* 保证最终一致性。而在多线程环境下可能发生重排序会影响结果。* ①若A线程执行到代码singleton new Singleton()时;* ②同时若B线程进来执行到代码到第一层检查if (singleton null)* ③当cpu切换到A线程执行代码singleton new Singleton();时发生了指令重排序* 执行了a-b没有执行c,此时的singleton对象只有地址没有内容。然后cpu又切换到了B线程* 这时singleton null为false比较的是内存地址* 则代码会直接执行到了return返回一个未初始化的对象只有地址没有内容。* */private volatile static Singleton singleton;private Singleton() {}public static Singleton getSingleton() {/*第一层检查检查是否有引用指向对象高并发情况下会有多个线程同时进入* ①当多个线程第一次进入所有线程都进入if语句* ②当多个线程第二次进入因为singleton已经不为null因此所有线程都不会进入if语句* 即不会执行锁从而也就不会因为锁而阻塞避免锁竞争*/if (singleton null) {/*第一层锁保证只有一个线程进入* ①多个线程第一次进入的时候只有一个线程会进入其他线程处于阻塞状态* 当进入的线程创建完对象出去之后其他线程又会进入创建对象所以有了第二次if检查* ②多个线程第二次是进入不到这里的因为已被第一次if检查拦截*/synchronized (Singleton.class) {/*第二层检查防止除了进入的第一个线程的其他线程重复创建对象*/if (singleton null) {singleton new Singleton();}}}return singleton;}
}
说明代码注释已详细讲解volatile在该单例模式的作用已经双重锁的作用。
① 优点解决了线程阻塞的问题。
② 缺点多个线程第一次进入的时候会造成大量的线程阻塞代码不够优雅。 静态内部类的方式
public class Singleton {private Singleton(){}private static class LayzInner{private static Singleton singleton new Singleton();}public static Singleton getSingleton(){return LayzInner.singleton;}
}
说明
① 优点第一次类创建的时候加载避免了内存浪费不存在阻塞问题线程安全唯一性
② 缺点序列化-漏洞反射会破坏内部类单例模式
2.5 建造者模式
经常碰见的 XxxBuilder 的类通常都是建造者模式的产物。建造者模式其实有很多的变种但是对于客户端来说我们的使用通常都是一个模式的
Food food new FoodBuilder().a().b().c().build();
Food food Food.builder().a().b().c().build();
套路就是先 new 一个 Builder然后可以链式地调用一堆方法最后再调用一次 build() 方法我们需要的对象就有了。
来一个中规中矩的建造者模式
class User {// 下面是“一堆”的属性private String name;private String password;private String nickName;private int age;// 构造方法私有化不然客户端就会直接调用构造方法了private User(String name, String password, String nickName, int age) {this.name name;this.password password;this.nickName nickName;this.age age;}// 静态方法用于生成一个 Builder这个不一定要有不过写这个方法是一个很好的习惯// 有些代码要求别人写 new User.UserBuilder().a()...build() 看上去就没那么好public static UserBuilder builder() {return new UserBuilder();}public static class UserBuilder {// 下面是和 User 一模一样的一堆属性private String name;private String password;private String nickName;private int age;private UserBuilder() {}// 链式调用设置各个属性值返回 this即 UserBuilderpublic UserBuilder name(String name) {this.name name;return this;}public UserBuilder password(String password) {this.password password;return this;}public UserBuilder nickName(String nickName) {this.nickName nickName;return this;}public UserBuilder age(int age) {this.age age;return this;}// build() 方法负责将 UserBuilder 中设置好的属性“复制”到 User 中。// 当然可以在 “复制” 之前做点检验public User build() {if (name null || password null) {throw new RuntimeException(用户名和密码必填);}if (age 0 || age 150) {throw new RuntimeException(年龄不合法);}// 还可以做赋予”默认值“的功能if (nickName null) {nickName name;}return new User(name, password, nickName, age);}}
}
核心是先把所有的属性都设置给 Builder然后 build() 方法的时候将这些属性复制给实际产生的对象。
看看客户端的调用
public class APP {public static void main(String[] args) {User d User.builder().name(foo).password(pAss12345).age(25).build();}
}
说实话建造者模式的链式写法很吸引人但是多写了很多“无用”的 builder 的代码感觉这个模式没什么用。不过当属性很多而且有些必填有些选填的时候这个模式会使代码清晰很多。我们可以在 Builder 的构造方法中强制让调用者提供必填字段还有在 build() 方法中校验各个参数比在 User 的构造方法中校验代码要优雅一些。
题外话强烈建议读者使用 lombok用了 lombok 以后上面的一大堆代码会变成如下这样
Builder
class User {private String name;private String password;private String nickName;private int age;
}
当然如果你只是想要链式写法不想要建造者模式有个很简单的办法User 的 getter 方法不变所有的 setter 方法都让其 return this 就可以了然后就可以像下面这样调用
User user new User().setName().setPassword().setAge(20);
很多人是这么用的但是这种写法不太优雅不是很推荐使用。
2.6 原型模式
在某些情况下需要创建对象的副本但复制一个对象的成本可能很高或者希望避免与对象的具体类耦合。例如当创建对象的过程较为复杂或者对象包含大量共享的状态时使用常规的创建方法可能会导致性能下降。
原型模式的解决方案是通过复制现有对象来创建新对象而不是从头开始构建。这允许我们以更高效的方式创建新对象同时避免了与对象类的直接耦合。核心概念是在原型对象的基础上进行克隆使得新对象具有与原型相同的初始状态。 原型模式很简单有一个原型实例基于这个原型实例产生新的实例也就是“克隆”了。 Object 类中有一个 clone() 方法它用于生成一个新的对象当然如果我们要调用这个方法java 要求我们的类必须先实现 Cloneable 接口此接口没有定义任何方法但是不这么做的话在 clone() 的时候会抛出 CloneNotSupportedException 异常。
protected native Object clone() throws CloneNotSupportedException;
注意事项
深克隆问题原型模式默认进行浅克隆即复制对象本身和其引用。如果对象内部包含其他对象的引用可能需要实现深克隆来复制整个对象结构。克隆方法的实现某些对象可能不容易进行克隆特别是涉及到文件、网络连接等资源的情况。 Java 的克隆是浅克隆碰到对象引用的时候克隆出来的对象和原对象中的引用将指向同一个对象。通常实现深克隆的方法是将对象进行序列化然后再进行反序列化。 总之原型模式是一种在需要创建对象副本时非常有用的设计模式它提供了一种灵活且高效的方法来处理对象的复制需求。 2.7 创建型模式总结
创建型模式总体上比较简单它们的作用就是为了产生实例对象算是各种工作的第一步了因为我们写的是面向对象的代码所以我们第一步当然是需要创建一个对象了。
总结
工厂模式在简单工厂模式的基础上增加了选择工厂的维度需要第一步选择合适的工厂抽象工厂模式有产品族的概念如果各个产品是存在兼容性问题的就要用抽象工厂模式单例模式为了保证全局使用的是同一对象一方面是安全性考虑一方面是为了节省资源建造者模式专门对付属性很多的那种类为了让代码更优美原型模式用得比较少了解和 Object 类中的 clone() 方法相关的知识即可。 后续待更新...... 文章转载自: http://www.morning.zzjpy.cn.gov.cn.zzjpy.cn http://www.morning.srckl.cn.gov.cn.srckl.cn http://www.morning.wqkfm.cn.gov.cn.wqkfm.cn http://www.morning.wgzgr.cn.gov.cn.wgzgr.cn http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn http://www.morning.wrbf.cn.gov.cn.wrbf.cn http://www.morning.rwtlj.cn.gov.cn.rwtlj.cn http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn http://www.morning.sjgsh.cn.gov.cn.sjgsh.cn http://www.morning.qwmpn.cn.gov.cn.qwmpn.cn http://www.morning.lhldx.cn.gov.cn.lhldx.cn http://www.morning.tddrh.cn.gov.cn.tddrh.cn http://www.morning.lpnb.cn.gov.cn.lpnb.cn http://www.morning.zqzzn.cn.gov.cn.zqzzn.cn http://www.morning.ypktc.cn.gov.cn.ypktc.cn http://www.morning.txnqh.cn.gov.cn.txnqh.cn http://www.morning.qnbsx.cn.gov.cn.qnbsx.cn http://www.morning.dighk.com.gov.cn.dighk.com http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.mjtgt.cn.gov.cn.mjtgt.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.sjjq.cn.gov.cn.sjjq.cn http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.yuminfo.com.gov.cn.yuminfo.com http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.lnbcg.cn.gov.cn.lnbcg.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.sdamsm.com.gov.cn.sdamsm.com http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn http://www.morning.thnpj.cn.gov.cn.thnpj.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn http://www.morning.zfrs.cn.gov.cn.zfrs.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.dwfzm.cn.gov.cn.dwfzm.cn http://www.morning.lbbgf.cn.gov.cn.lbbgf.cn http://www.morning.kwfnt.cn.gov.cn.kwfnt.cn http://www.morning.c7498.cn.gov.cn.c7498.cn http://www.morning.hrqfl.cn.gov.cn.hrqfl.cn http://www.morning.lwrks.cn.gov.cn.lwrks.cn http://www.morning.zqwqy.cn.gov.cn.zqwqy.cn http://www.morning.mswkd.cn.gov.cn.mswkd.cn http://www.morning.hxycm.cn.gov.cn.hxycm.cn http://www.morning.tyhfz.cn.gov.cn.tyhfz.cn http://www.morning.pwghp.cn.gov.cn.pwghp.cn http://www.morning.rfbt.cn.gov.cn.rfbt.cn http://www.morning.qgxnw.cn.gov.cn.qgxnw.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.rxhsm.cn.gov.cn.rxhsm.cn http://www.morning.qpljg.cn.gov.cn.qpljg.cn http://www.morning.wjhdn.cn.gov.cn.wjhdn.cn http://www.morning.kgltb.cn.gov.cn.kgltb.cn http://www.morning.tqwcm.cn.gov.cn.tqwcm.cn http://www.morning.pwqyd.cn.gov.cn.pwqyd.cn http://www.morning.twwts.com.gov.cn.twwts.com http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.dnqlba.cn.gov.cn.dnqlba.cn http://www.morning.zttjs.cn.gov.cn.zttjs.cn http://www.morning.wzwpz.cn.gov.cn.wzwpz.cn http://www.morning.ltypx.cn.gov.cn.ltypx.cn http://www.morning.pdgqf.cn.gov.cn.pdgqf.cn http://www.morning.rzmzm.cn.gov.cn.rzmzm.cn http://www.morning.tpssx.cn.gov.cn.tpssx.cn http://www.morning.nclbk.cn.gov.cn.nclbk.cn http://www.morning.bswnf.cn.gov.cn.bswnf.cn http://www.morning.nkllb.cn.gov.cn.nkllb.cn http://www.morning.thlr.cn.gov.cn.thlr.cn http://www.morning.lblsx.cn.gov.cn.lblsx.cn http://www.morning.rgyts.cn.gov.cn.rgyts.cn http://www.morning.rfmzc.cn.gov.cn.rfmzc.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.hjwxm.cn.gov.cn.hjwxm.cn http://www.morning.yckrm.cn.gov.cn.yckrm.cn http://www.morning.xdpjs.cn.gov.cn.xdpjs.cn http://www.morning.xqjz.cn.gov.cn.xqjz.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.wqbfd.cn.gov.cn.wqbfd.cn http://www.morning.rlqwz.cn.gov.cn.rlqwz.cn