1. 设计模式的定义与分类
设计模式是一套被反复使用、多数人知晓的、经过分类编目的,代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解、提高代码的可读性。
1.1 设计模式的基本要素
- 模式名称
- 问题
- 解决方案
- 效果
1.2 设计模式的分类
- 创建型
主要用于创建对象,GoF提供了5种创建型的模式,分别是工厂方法模式、抽象工厂模式、建造者模式、原型模式和单例模式
- 结构型
主要用于处理类与对象的组合,GoF提供了7种结构型模型,分别是适配器模型、享元模型、桥接模式、组合模式、装饰模式、外观模式、代理模式
- 行为型
主要用于描述对象类或对象怎么样交互和怎么样分配职责,GoF提供了11种行为模型、分别是职责链模式、命令模式、解释器模式、迭代模式、中介者、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式、访问者模式
2. 简单工厂模式
在实际的软件开发过程中,有时候需要创建一些来自相同父类的类的实例,为此可以专门定义一个类来负责创建这些类的实例,这些被创建的实例具有共同的父类。
2.1 简单工厂模式结构与分析
简单工厂模式结构比较简单,其核心是工厂类。
包含的角色:
工厂角色即使工厂类,它是工厂模式的核心,负责实现所有实例的创建内部逻辑,工厂类可以被外界直接调用,所创建的产品对象,在工厂类中提供了静态工厂方法返回一个抽象的产品类,所有的具体产品都是抽象的。
抽象产品是简单工厂模式所创建的所有对象的父类,负责描述所有实例共有的公共接口,它的引入将提高系统的灵活性。
具体产品是工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。
2.2 实现
package edu.simplFactory.bean;
public interface TV {
public void play();
}
package edu.simplFactory.factory;
import edu.simplFactory.impl.HaierTV;
import edu.simplFactory.impl.HisenseTV;
import edu.simplFactory.bean.TV;
public class TVFactory {
public static TV create(String brand) throws Exception{
if(brand.equalsIgnoreCase("Haier")){
System.out.println("电视工厂生产海尔电视");
return new HaierTV();
}else if(brand.equalsIgnoreCase("Hisense")){
System.out.println("电视工厂生产海信电视");
return new HisenseTV();
}else{
throw new Exception("对不起,暂时无法生产该品牌电视");
}
}
}
package edu.simplFactory.impl;
import edu.simplFactory.bean.TV;
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔电视播放中。。。");
}
}
package edu.simplFactory.impl;
import edu.simplFactory.bean.TV;
public class HisenseTV implements TV{
@Override
public void play() {
System.out.println("海信电视播放中。。。");
}
}
package edu.simplFactory.utils;
import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLUtilTV {
public static String getBrandName(){
try{
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("configTV.xml"));
NodeList nl = doc.getElementsByTagName("branName");
Node firstChild = nl.item(0).getFirstChild();
String branName = firstChild.getNodeValue().trim();
return branName;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
<?xml version="1.0"?>
<config>
<branName>Hisense</branName>
</config>
package edu.simplFactory;
import edu.simplFactory.bean.TV;
import edu.simplFactory.factory.TVFactory;
import edu.simplFactory.utils.XMLUtilTV;
public class Client {
public static void main(String[] args) {
try{
TV tv;
String brandName = XMLUtilTV.getBrandName();
tv = TVFactory.create(brandName);
tv.play();
}catch(Exception e){
e.printStackTrace();
}
}
}
|