设计模式(JAVA)


一、简单工厂模式

简述:一个工厂,想要什么自己就生产什么
图例:
在这里插入图片描述

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()
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值