项目简介
该项目运用了三种设计模式:抽象工厂模式,单例模式,代理模式。
用户可以在商店里购买自己想要的手机和电脑。项目运行环境为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