设计模式
一、简单工厂模式
简述:一个工厂,想要什么自己就生产什么
图例:
package 设计模式.简单工厂模式;
//抽象产品类
public interface TV {
public void play();
}
package 设计模式.简单工厂模式;
//具体产品类
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔电视机播放中...");
}
}
package 设计模式.简单工厂模式;
//具体产品类
public class HisenseTV implements TV{
@Override
public void play() {
System.out.println("海信电视机播放中...");
}
}
package 设计模式.简单工厂模式;
//工厂类
public class TVFactory {
public static TV productTV(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("对不起,咱不能生产该品牌电视机!");
}
}
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<config>
<brandName>Haier</brandName>
</config>
package 设计模式.简单工厂模式;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
//XML操作工具类
public class XMLUtilTV {
public static String getBrandName()
{
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("src/设计模式/简单工厂模式/configTV.xml"));
NodeList nl=doc.getElementsByTagName("brandName");
Node classNode=nl.item(0).getFirstChild();
String brandName=classNode.getNodeValue().trim();
return brandName;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package 设计模式.简单工厂模式;
public class Cilent {
public static void main(String[] args)
{
try {
TV tv;
String brandName=XMLUtilTV.getBrandName();
tv=TVFactory.productTV(brandName);
tv.play();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、工厂方法模式
简述:多个工厂,不同工厂生产各自的产品
图例:
package 设计模式.工厂方法模式;
//抽象产品类
public interface TV {
public void play();
}
package 设计模式.工厂方法模式;
//具体产品类
public class HaierTV implements TV{
@Override
public void play() {
System.out.println("海尔电视机播放中...");
}
}
package 设计模式.工厂方法模式;
//具体产品类
public class HisenseTV implements TV{
@Override
public void play() {
System.out.println("海信电视机播放中...");
}
}
package 设计模式.工厂方法模式;
//抽象工厂类
public interface TVFactory {
public TV productTV();
}
package 设计模式.工厂方法模式;
public class HaierTVFactory implements TVFactory{
@Override
public TV productTV() {
System.out.println("海尔电视机工厂生产海尔电视机.");
return new HaierTV();
}
}
package 设计模式.工厂方法模式;
public class HisenseTVFactory implements TVFactory{
@Override
public TV productTV() {
System.out.println("海信电视机工厂生产海信电视机。");
return new HisenseTV();
}
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<config>
<className>HaierTVFactory</className>
</config>
package 设计模式.工厂方法模式;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("src/设计模式/工厂方法模式/configTV.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue().trim();
//通过类名生成实例对象并将其返回
Class c=Class.forName("设计模式.工厂方法模式."+cName);
Object obj=c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package 设计模式.工厂方法模式;
public class Client {
public static void main(String[] args)
{
TV tv;
TVFactory factory;
factory= (TVFactory) XMLUtil.getBean();
tv=factory.productTV();
tv.play();
}
}
三、抽象工厂模式
简述:多个工厂,多种产品,不同工厂生产属于自己牌子的产品
图例:
package 设计模式.抽象工厂模式;
//抽象产品类
public interface Television {
public void play();
}
package 设计模式.抽象工厂模式;
//具体产品类
public class HaierTelevision implements Television{
@Override
public void play() {
System.out.println("海尔电视机播放中...");
}
}
package 设计模式.抽象工厂模式;
//具体产品类
public class TCLTelevision implements Television{
@Override
public void play() {
System.out.println("TCL电视机播放中...");
}
}
package 设计模式.抽象工厂模式;
//抽象产品类
public interface AirConditioner {
public void changeTemperature();
}
package 设计模式.抽象工厂模式;
//具体产品类
public class HairAirConditioner implements AirConditioner{
@Override
public void changeTemperature() {
System.out.println("海尔空调温度改变中...");
}
}
package 设计模式.抽象工厂模式;
//抽象工厂类
public interface EFactory {
public Television produceTelevision();
public AirConditioner produceAirConditioner();
}
package 设计模式.抽象工厂模式;
//具体工厂类
public class HaierFactory implements EFactory{
@Override
public Television produceTelevision() {
return new HaierTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
return new HairAirConditioner();
}
}
package 设计模式.抽象工厂模式;
//具体工厂类
public class TCLFactory implements EFactory{
@Override
public Television produceTelevision() {
return new TCLTelevision();
}
@Override
public AirConditioner produceAirConditioner() {
return new TCLAirConditioner();
}
}
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<className>HaierFactory</className>
</config>
package 设计模式.抽象工厂模式;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("src/设计模式/抽象工厂模式/config.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue().trim();
//通过类名生成实例对象并将其返回
Class c=Class.forName("设计模式.抽象工厂模式."+cName);
Object obj=c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package 设计模式.抽象工厂模式;
public class Client {
public static void main(String[] args)
{
try {
EFactory factory;
Television tv;
AirConditioner ac;
factory= (EFactory) XMLUtil.getBean();
tv=factory.produceTelevision();
tv.play();
ac=factory.produceAirConditioner();
ac.changeTemperature();
}catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
四、建造者模式
简述:一个服务员去帮助用户准备不同的套餐
图例:
package 设计模式.建造者模式;
//产品类
public class Meal {
private String food;
private String drink;
public String getFood() {
return food;
}
public void setFood(String food) {
this.food = food;
}
public String getDrink() {
return drink;
}
public void setDrink(String drink) {
this.drink = drink;
}
}
package 设计模式.建造者模式;
//抽象建造者类
public abstract class MealBuilder {
protected Meal meal=new Meal();
public abstract void buildFood();
public abstract void buildDrink();
public Meal getMeal()
{
return meal;
}
}
package 设计模式.建造者模式;
//具体建造者类A
public class SubMealBuilderA extends MealBuilder{
@Override
public void buildFood() {
meal.setFood("一个鸡腿堡");
}
@Override
public void buildDrink() {
meal.setDrink("一杯可乐");
}
}
package 设计模式.建造者模式;
//具体建造者类B
public class SubMealBuilderB extends MealBuilder{
@Override
public void buildFood() {
meal.setFood("一个鸡肉卷");
}
@Override
public void buildDrink() {
meal.setDrink("一杯果汁");
}
}
package 设计模式.建造者模式;
//指挥者类
public class KFCWaiter {
private MealBuilder mb;
public void setMealBuilder(MealBuilder mb) {
this.mb = mb;
}
public Meal construct()
{
mb.buildDrink();
mb.buildFood();
return mb.getMeal();
}
}
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<className>SubMealBuilderA</className>
</config>
package 设计模式.建造者模式;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=dFactory.newDocumentBuilder();
Document doc;
doc=builder.parse(new File("src/设计模式/建造者模式/config.xml"));
NodeList nl=doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue().trim();
//通过类名生成实例对象并将其返回
Class c=Class.forName("设计模式.建造者模式."+cName);
Object obj=c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
package 设计模式.建造者模式;
public class Client {
public static void main(String[] args)
{
//动态确定套餐种类
MealBuilder mb= (MealBuilder) XMLUtil.getBean();
//服务员是指挥者
KFCWaiter waiter=new KFCWaiter();
//服务员准备套餐
waiter.setMealBuilder(mb);
//客户获得套餐
Meal meal=waiter.construct();
System.out.println("套餐组成:");
System.out.println(meal.getFood());
System.out.println(meal.getDrink());
}
}
五、原型模式
简述:深拷贝、浅拷贝
图例:
浅拷贝
package 设计模式.原型模式.浅克隆;
//具体原型类
public class Email implements Cloneable{
private Attachment attachment=null;
public Email()
{
this.attachment=new Attachment();
}
public Object clone()
{
Email clone=null;
try{
clone= (Email) super.clone();
}catch(CloneNotSupportedException e)
{
System.out.println("Clone failure!");
}
return clone;
}
public Attachment getAttachment()
{
return this.attachment;
}
public void display()
{
System.out.println("查看邮件");
}
}
package 设计模式.原型模式.浅克隆;
//附件类
public class Attachment {
public void download()
{
System.out.println("下载附件");
}
}
package 设计模式.原型模式.浅克隆;
public class Client {
public static void main(String[] agrs)
{
Email email,copyEmail;
email=new Email();
copyEmail= (Email) email.clone();
System.out.println("email==copyEmail?");
System.out.println(email==copyEmail);
System.out.println("email.getAttachment==copyEmail.getAttachment?");
System.out.println(email.getAttachment()==copyEmail.getAttachment());
}
}
深拷贝
package 设计模式.原型模式.深克隆;
//具体原型类
import java.io.*;
public class Email implements Serializable {
private Attachment attachment=null;
public Email()
{
this.attachment=new Attachment();
}
public Object deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bao=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(bao);
oos.writeObject(this);
//将对象从流中取出
ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
ObjectInputStream ois=new ObjectInputStream(bis);
return (ois.readObject());
}
public Attachment getAttachment()
{
return this.attachment;
}
public void display()
{
System.out.println("查看邮件");
}
}
package 设计模式.原型模式.深克隆;
import java.io.Serializable;
//附件类
public class Attachment implements Serializable {
public void download()
{
System.out.println("下载附件");
}
}
package 设计模式.原型模式.深克隆;
public class Client {
public static void main(String[] args)
{
Email email,copyEmail=null;
email=new Email();
try
{
copyEmail= (Email) email.deepClone();
}catch (Exception e)
{
e.printStackTrace();
}
System.out.println("email==copyEmail?");
System.out.println(email==copyEmail);
System.out.println("email.getAttrachment==copyEmail.getAttachment?");
System.out.println(email.getAttachment()==copyEmail.getAttachment());
}
}
六、单例模式
简述:一个类只有一个对象,并且同一时间只有一个线程可以使用这个对象
包含所有类型的单例
package 设计模式.单例模式;
public class singletondemo {
public static void main(String[] args)
{
sington1 object=sington1.getInstance();
object.show();
}
}
//饿汉式,线程安全
class sington1{
private static sington1 instance=new sington1();
private sington1() {
}
public static sington1 getInstance(){
return instance;
}
public void show(){
System.out.println("Hello,world!");
}
}
//懒汉式,线程不安全
class sington2{
private static sington2 instance;
private sington2(){
}
public static sington2 getInstance(){
if(instance==null)
{
instance=new sington2();
}
return instance;
}
public void show(){
System.out.println("Hello,world!");
}
}
//懒汉式,线程安全,加synchronized
class sington3{
private static sington3 instance;
private sington3(){
}
public static synchronized sington3 getInstance()