设计模式课程设计(抽象工厂模式,单例模式,代理模式)

本项目通过抽象工厂模式、单例模式和代理模式,实现了手机和电脑的选购流程。用户可在商店选择华为或小米的产品,系统确保单一实例的商店界面,并通过代理处理购买请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设计模式课程设计:手机电脑商店

项目简介

  该项目运用了三种设计模式:抽象工厂模式,单例模式,代理模式。
  用户可以在商店里购买自己想要的手机和电脑。项目运行环境为Netbeans8.2。
  运行效果如下:

进入商店界面,这里运用了单例模式,不管怎么点击进入商店按钮,只会有一个窗体弹出
在这里插入图片描述
进入商店,用户可以选择自己要购买的东西。

在这里插入图片描述
用户购买成功
在这里插入图片描述

抽象工厂模式

抽象工厂:

package AbstractFactory;
public interface EFactory {
    public Phone producePhone();
    public Computer produceComputer();
}

抽象产品:

package AbstractFactory;
public interface Computer {
    public String produce ();
}
package AbstractFactory;
public interface Phone {
    public String produce();
}

具体工厂:

package AbstractFactory;
public class HuaWeiFactory implements EFactory {
    public HuaWeiFactory() {
    }
    public Phone producePhone() {
        return new HuaWeiPhone();
    }
    public Computer produceComputer() {
        return new HuaWeiComputer();
    }

}
package AbstractFactory;
public class XiaoMiFactory implements EFactory {
    public XiaoMiFactory() {
    }
    public Phone producePhone() {
        return new XiaoMiPhone();
    }
    public Computer produceComputer() {
        return new XiaoMiComputer();
    }
}

具体产品:

package AbstractFactory;
import Agent.AgentFrame;
public class HuaWeiComputer implements Computer {
    public HuaWeiComputer() {
    }
    public String produce() {
        System.out.println("华为电脑生产中......");
        String str = "华为电脑生产中......";
        return str;
    }
}
package AbstractFactory;
import Agent.AgentFrame;
public class HuaWeiPhone implements Phone {
    public HuaWeiPhone() {
    }
    public String produce() {
        System.out.println("华为手机生产中......");
        String str = "华为手机生产中......";
        return str;
    }
}
package AbstractFactory;
import Agent.AgentFrame;
public class XiaoMiComputer implements Computer {
    public XiaoMiComputer() {
    }
    public String produce() {
        System.out.println("小米电脑生产中......");
        String str = "小米电脑生产中......";
        return str;
    }
}
package AbstractFactory;
import Agent.AgentFrame;
public class XiaoMiPhone implements Phone {
    public XiaoMiPhone() {
    }
    public String produce() {
        System.out.println("小米手机生产中......");
        String str = "小米手机生产中......";
        return str;
    }
}

单例模式

package company;

import AbstractFactory.Computer;
import AbstractFactory.EFactory;
import AbstractFactory.HuaWeiComputer;
import AbstractFactory.HuaWeiFactory;
import AbstractFactory.HuaWeiPhone;
import AbstractFactory.Phone;

public class HuaWeiCompany {

    private static HuaWeiCompany huaweiCompany = null;
    private RealHuaWei realhuawei = new RealHuaWei();

    private HuaWeiCompany() {
    }

    public static HuaWeiCompany getHuaweiCompany() {
        if (huaweiCompany == null) {
            huaweiCompany = new HuaWeiCompany();
        }
        return huaweiCompany;
    }

    public Phone getPhoneProducts() {
        return realhuawei.getPhoneProducts();
    }

    public Computer getComputerProducts() {
        return realhuawei.getComputerProducts();
    }
}

package company;

import AbstractFactory.Computer;
import AbstractFactory.EFactory;
import AbstractFactory.HuaWeiComputer;
import AbstractFactory.HuaWeiFactory;
import AbstractFactory.HuaWeiPhone;
import AbstractFactory.Phone;
import AbstractFactory.XiaoMiComputer;
import AbstractFactory.XiaoMiFactory;
import AbstractFactory.XiaoMiPhone;

public class XiaoMiCompany {

    EFactory factory;
    Computer computer;
    Phone phone;

    private static XiaoMiCompany xiaomiCompany = null;
    private RealXiaoMi realxiaomi = new RealXiaoMi();

    private XiaoMiCompany() {
    }

    public static XiaoMiCompany getXiaomiCompany() {
        if (xiaomiCompany == null) {
            xiaomiCompany = new XiaoMiCompany();
        }
        return xiaomiCompany;
    }

    public Computer getComputerProducts() {
        return realxiaomi.getComputerProducts();
    }

    public Phone getPhoneProducts() {
        return realxiaomi.getPhoneProducts();
    }

}

代理模式

package company;
import AbstractFactory.Computer;
import AbstractFactory.Phone;
public interface Permission {
    public Phone getPhoneProducts();
    public Computer getComputerProducts();
}
package company;
import AbstractFactory.Computer;
import AbstractFactory.Phone;
public interface Permission_2 {
    public Phone getPhoneProducts();
    public Computer getComputerProducts();
}
package company;
import AbstractFactory.Computer;
import AbstractFactory.*;
import AbstractFactory.Phone;
public class RealHuaWei implements Permission {

    EFactory factory;
    Computer computer;
    Phone phone;

    public Phone getPhoneProducts() {
        factory = new HuaWeiFactory();
        phone = new HuaWeiPhone();
        phone.produce();
        return phone;
    }

    @Override
    public Computer getComputerProducts() {
        factory = new HuaWeiFactory();
        computer = new HuaWeiComputer();
        computer.produce();
        return computer;
    }

}
package company;
import AbstractFactory.*;
public class RealXiaoMi {
    EFactory factory;
    Computer computer;
    Phone phone;
    public Computer getComputerProducts() {
        factory = new XiaoMiFactory();
        computer = new XiaoMiComputer();
        computer.produce();
        return computer;
    }
    public Phone getPhoneProducts() {
        factory = new XiaoMiFactory();
        phone = new XiaoMiPhone();
        phone.produce();
        return phone;
    }
}

商店:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Agent;

import javax.swing.JButton;
import javax.swing.JLabel;

/**
 *
 * @author 12995
 */
public class WelcomeFrame extends javax.swing.JFrame {

    private AgentFrame f2;

    /**
     * Creates new form WelcomeFrame
     */
    public WelcomeFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton_Enter = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton_Enter.setText("进入商店");
        jButton_Enter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton_EnterActionPerformed(evt);
            }
        });

        jLabel1.setText("手机电脑专卖店");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(105, 105, 105)
                        .addComponent(jButton_Enter, javax.swing.GroupLayout.PREFERRED_SIZE, 254, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(182, 182, 182)
                        .addComponent(jLabel1)))
                .addContainerGap(112, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(107, Short.MAX_VALUE)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(87, 87, 87)
                .addComponent(jButton_Enter)
                .addGap(31, 31, 31))
        );

        pack();
    }// </editor-fold>                        

    private void jButton_EnterActionPerformed(java.awt.event.ActionEvent evt) {                                              
        // TODO add your handling code here:
        f2 = AgentFrame.getInstance();
        f2.setVisible(true);
        f2.setLocationRelativeTo(null);
        
    }                                             

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(WelcomeFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(WelcomeFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(WelcomeFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(WelcomeFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new WelcomeFrame().setVisible(true);
            }
        });
    }

    public JButton getjButton_Enter() {
        return jButton_Enter;
    }

    public void setjButton_Enter(JButton jButton_Enter) {
        this.jButton_Enter = jButton_Enter;
    }

    public JLabel getjLabel1() {
        return jLabel1;
    }

    public void setjLabel1(JLabel jLabel1) {
        this.jLabel1 = jLabel1;
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton_Enter;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package Agent;

import AbstractFactory.Computer;
import AbstractFactory.EFactory;
import AbstractFactory.HuaWeiComputer;
import AbstractFactory.HuaWeiPhone;
import AbstractFactory.Phone;
import AbstractFactory.XiaoMiComputer;
import AbstractFactory.XiaoMiPhone;
import company.HuaWeiCompany;
import company.XiaoMiCompany;
import javax.swing.JTextArea;

/**
 *
 * @author 12995
 */
public class AgentFrame extends javax.swing.JFrame {

    EFactory factory;
    Computer computer;
    Phone phone;

    private static AgentFrame SingletonFrame = null;
    //public AbstractPermission permission = new PermissionProxy();
    HuaWeiCompany hwc = HuaWeiCompany.getHuaweiCompany();
    XiaoMiCompany xmc = XiaoMiCompany.getXiaomiCompany();

    /**
     * Creates new form AgentFrame
     */
    private AgentFrame() {
        initComponents();
    }

    public static AgentFrame getInstance() {
        if (SingletonFrame == null) {
            SingletonFrame = new AgentFrame();
        }
        return SingletonFrame;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jCheckBox1 = new javax.swing.JCheckBox();
        jCheckBox2 = new javax.swing.JCheckBox();
        jCheckBox3 = new javax.swing.JCheckBox();
        jCheckBox4 = new javax.swing.JCheckBox();
        jButton_Buy = new javax.swing.JButton();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea_Display = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("欢迎光临本商店");

        jCheckBox1.setText("华为手机");

        jCheckBox2.setText("华为电脑");

        jCheckBox3.setText("小米手机");

        jCheckBox4.setText("小米电脑");

        jButton_Buy.setText("购买");
        jButton_Buy.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButton_BuyMouseClicked(evt);
            }
        });

        jTextArea_Display.setColumns(20);
        jTextArea_Display.setRows(5);
        jScrollPane2.setViewportView(jTextArea_Display);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 219, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(180, 180, 180)
                        .addComponent(jLabel1)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jCheckBox1)
                        .addGap(47, 47, 47)
                        .addComponent(jCheckBox2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 48, Short.MAX_VALUE)
                        .addComponent(jCheckBox3)
                        .addGap(41, 41, 41)
                        .addComponent(jCheckBox4)))
                .addContainerGap())
            .addGroup(layout.createSequentialGroup()
                .addGap(182, 182, 182)
                .addComponent(jButton_Buy)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jLabel1)
                .addGap(29, 29, 29)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jCheckBox1)
                    .addComponent(jCheckBox2)
                    .addComponent(jCheckBox3)
                    .addComponent(jCheckBox4))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton_Buy)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        
/**/
    private void jButton_BuyMouseClicked(java.awt.event.MouseEvent evt) {                                         
        // TODO add your handling code here:

        if (jCheckBox1.isSelected()) {
            HuaWeiPhone HWP;
            // HWP = (HuaWeiPhone) permission.buyHWPProducct("华为手机");
            HWP=(HuaWeiPhone) hwc.getPhoneProducts();
            jTextArea_Display.append(HWP.produce() + "\n");
            jTextArea_Display.append("这是您要购买的华为手机,请拿好!\n");
            jTextArea_Display.append("\n");
        }
        if (jCheckBox2.isSelected()) {
            HuaWeiComputer HWC;
            //HWC = (HuaWeiComputer) permission.buyHWCProducct("华为电脑");
            HWC=(HuaWeiComputer) hwc.getComputerProducts();
            jTextArea_Display.append(HWC.produce() + "\n");
            jTextArea_Display.append("这是您要购买的华为电脑,请拿好!\n");
            jTextArea_Display.append("\n");
        }
        if (jCheckBox3.isSelected()) {
            XiaoMiPhone XMP;
            //XMP = (XiaoMiPhone) permission.buyXMPProducct("小米手机");
            XMP= (XiaoMiPhone) xmc.getPhoneProducts();
            jTextArea_Display.append(XMP.produce() + "\n");
            jTextArea_Display.append("这是您要购买的小米手机,请拿好!\n");
            jTextArea_Display.append("\n");
        }
        if (jCheckBox4.isSelected()) {
            XiaoMiComputer XMC;
            //XMC = (XiaoMiComputer) permission.buyXMCProducct("小米电脑");
            XMC=(XiaoMiComputer)xmc.getComputerProducts();
            jTextArea_Display.append(XMC.produce() + "\n");
            jTextArea_Display.append("这是您要购买的小米电脑,请拿好!\n");
            jTextArea_Display.append("\n");
        }
    }                                        

    public JTextArea getjTextArea_Display() {
        return jTextArea_Display;
    }

    public void setjTextArea_Display(JTextArea jTextArea_Display) {
        this.jTextArea_Display = jTextArea_Display;
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton_Buy;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JCheckBox jCheckBox2;
    private javax.swing.JCheckBox jCheckBox3;
    private javax.swing.JCheckBox jCheckBox4;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextArea_Display;
    // End of variables declaration                   
}

NetBeans8.2UML插件安装地址: http://updates.netbeans.org/netbeans/updates/6.5/uc/final/stable/catalog_zh_CN.xml.gz
NetBeans8.2安装UML教程请自行百度。
项目源码:JavaApplication1_1
类图:UMLProject1

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值