package com.jelly.mypattern.simpleFactory;
/**
* 抽象发送器
* 如 可以表示邮件、短信 等发送器
* @author jelly
*
*/
public interface ISender {
public void send(String content);//发送的方法
}
package com.jelly.mypattern.simpleFactory;
/**
* 邮件发送器 产品
* @author jelly
*
*/
public class MailSender implements ISender{
@Override
public void send(String content) {
//邮件发送器 , 发送一封邮件
System.out.println("send a mail:"+content);
}
}
package com.jelly.mypattern.simpleFactory;
/**
* 短信发送器 产品
* @author jelly
*
*/
public class SmsSender implements ISender{
@Override
public void send(String content) {
//短信发送器 发送 方法:发送一条短信
System.out.println("send a sms:"+content);
}
}
package com.jelly.mypattern.simpleFactory;
/**
* 简单 工厂
* 生产发送器
* @author jelly
*
*/
public class SenderFactory {
public ISender getSender(String senderType){
ISender sender=null;
if(senderType.equals("sms")){
sender=new SmsSender();
}
else if(senderType.equals("mail")){
sender=new MailSender();
}
return sender;
}
}
package com.jelly.mypattern.simpleFactory;
/**
* 客户端 测试类
* @author jelly
*
*/
public class SimpleFactoryTest {
/**
* Simple Factory
* 简单工厂模式总结:
* 1、 工厂只有一个,且工厂中创建产品的方法也只有一个。
* 2、客户端代码中要得到产品,只能调用通过工厂中的这个方法,传入不同的产品类型,得到具体的某个产品。
* 3、每新增一种新的产品都需要在工厂方法中新增一种产品类型。
*/
public static void main(String[] args) {
SenderFactory senderFactory=new SenderFactory();
ISender sender= senderFactory.getSender("sms");
sender.send("你好 world");
ISender sender2= senderFactory.getSender("mail");
sender2.send("你好 world");
}
}
/**
* 工厂
* 生产发送器
* @author jelly
*
*/
public class SenderFactory {
public ISender getSmsSender(){
return new SmsSender();
}
public ISender getMailSender(){
return new MailSender();
}
}
package com.jelly.mypattern.factoryMethod;
/**
* 客户端 调用测试 类
* @author jelly
*
*/
public class FactoryMethodTest {
/**
* Factory Method
* 工厂 方法模式总结:
* 1 此模式中工厂有一个,工厂中的方法有多个。
* 2 每新增一种产品就需要在工厂中新加一个生产方法
*/
public static void main(String[] args) {
SenderFactory senderFactory=new SenderFactory();
ISender sender= senderFactory.getMailSender();
sender.send("你好 world");
ISender sender2= senderFactory.getSmsSender();
sender2.send("你好 world");
}
}
package com.jelly.mypattern.staticFactory;
/**
* 发送器 静态工厂
* @author jelly
*
*/
public class SenderFactory {
/**
* 生产 smsSender
* @return
*/
public static ISender getSmsSender(){
return new SmsSender();
}
/**
* 生产 MailSender
* @return
*/
public static ISender getMailSender(){
return new MailSender();
}
}
package com.jelly.mypattern.staticFactory;
/**
* 静态工厂 客户端测试类
* @author jelly
*
*/
public class StaticFactoryTest {
/**
* 静态工厂模式:
* 也称为静态工厂方法模式,属于工厂方法模式的静态变体。
* 与工厂方法模式的使用相同,只是无须创建工厂对象。
*
*/
public static void main(String[] args) {
ISender sender= SenderFactory.getMailSender();
sender.send("你好 world");
ISender sender2= SenderFactory.getSmsSender();
sender2.send("你好 world");
}
}
package com.jelly.mypattern.abstractFactory;
/**
* 抽象工厂
* @author jelly
*
*/
public interface ISenderFactory {
/**
* 生产发送器
* @return
*/
public ISender getSender();
}
package com.jelly.mypattern.abstractFactory;
public class MailSenderFactory implements ISenderFactory {
/**
* 生产邮件发送器
*/
@Override
public ISender getSender() {
return new MailSender();
}
}
package com.jelly.mypattern.abstractFactory;
/**
* 短信发送器 工厂
* @author jelly
*
*/
public class SmsSenderFactory implements ISenderFactory{
/**
* 生产短信发送器
*/
@Override
public ISender getSender() {
return new SmsSender();
}
}
package com.jelly.mypattern.abstractFactory;
/**
* 抽象工厂模式 客户端调用测试类
* @author jelly
*
*/
public class AbstractFactoryTest {
/**
* 抽象工厂模式总结:
* 1 在工厂类层次接口中的顶层有一个抽象的工厂,生产抽象的产品
* 2 抽象工厂派生出具体的工厂类,在具体的工厂类中生产具体的产品
* 3 如需要新增一种生产产品,则需要新增一个工厂类
*/
public static void main(String[] args) {
//得到工厂
ISenderFactory senderFactory=new SmsSenderFactory();
//工厂生产产品
ISender sender =senderFactory.getSender();
//使用产品
sender.send("你好 world");
ISenderFactory senderFactory2=new MailSenderFactory();
ISender sender2 =senderFactory2.getSender();
sender2.send("你好 world");
}
}
package com.jelly.mypattern.singleton;
/**
* 单例模式
* @author jelly
*
*/
public class SingleClass {
private static SingleClass instance=new SingleClass();
/**
* 私有化构造方法
*/
private SingleClass(){
}
/**
* 暴露公有的静态方法 得到一个实例对象
* @return
*/
public static SingleClass getInstance(){
return instance;
}
//实例方法
public void aMethod(){
System.out.println("execute aMethod 方法");
}
//实例方法
public void bMethod(){
System.out.println("execute bMethod 方法");
}
}
/**
* 单例模式 客户端调用测试类
* @author jelly
*
*/
public class SingleClassTest {
/**单例模式:
*1 保证在整个应用程序中此类只有一个实例对象。
*2 采用单实例对象承担此类的所有职责。
* @param args
*/
public static void main(String[] args) {
SingleClass single=SingleClass.getInstance();
single.aMethod();//调用实例对象的a方法
single.bMethod();//调用实例对象的b方法
}
}
package com.jelly.mypattern.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 业务类
* @author jelly
*
*/
public class MyClass implements Serializable{
private static final long serialVersionUID = 6468810466201374898L;
private String name;
public MyClass() {
super();
}
public MyClass(String name) {
super();
this.name = name;
}
public void aMethod(){
System.out.println("执行 aMethod 方法: "+name);
}
public void bMethod(){
System.out.println("执行 bMethod 方法: "+name);
}
/**
* 深克隆
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public MyClass deepClone() throws IOException, ClassNotFoundException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (MyClass) ois.readObject();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.jelly.mypattern.prototype;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* 克隆工具类
* @author jelly
*
*/
public class CloneUtil {
/**
* 对实现Serializable 接口的对象进行 完全的克隆
* @param obj
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
public static Serializable deepClone(Serializable obj)throws IOException, ClassNotFoundException{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return (Serializable) ois.readObject();
}
}
package com.jelly.mypattern.prototype;
/**
* 原型模式 客户端测试类
* @author jelly
*
*/
public class PrototypeTest {
/**
* Prototype 模式
* 原型模式
* 1 通过某个对象为原型(模型),克隆出一个新对象的方式创建新对象。
* 2 克隆对象必须实现序列化接口(标记接口)
* 3 克隆对象必须使用到深克隆。
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception{
MyClass obj1=new MyClass("张三");
MyClass obj2= obj1.deepClone();
obj2.setName("李四");
obj2.aMethod();
obj2.bMethod();
obj1.aMethod();
obj1.bMethod();
MyClass obj3=(MyClass) CloneUtil.deepClone(obj2);
obj3.setName("王五");
obj3.aMethod();
obj3.bMethod();
}
}
package com.jelly.mypattern.builder;
/**
*
* 邀请函(某活动)
* @author jelly
*
*/
public class Invitation {
private String subject;//邀请的主题
private String holder;//活动举办者 举办方 举办机构
private String holderTime;//举办时间
private String holderPlace ;//举办地点
private String invitName;//被邀请人姓名
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getHolder() {
return holder;
}
public void setHolder(String holder) {
this.holder = holder;
}
public String getHolderTime() {
return holderTime;
}
public void setHolderTime(String holderTime) {
this.holderTime = holderTime;
}
public String getHolderPlace() {
return holderPlace;
}
public void setHolderPlace(String holderPlace) {
this.holderPlace = holderPlace;
}
public String getInvitName() {
return invitName;
}
public void setInvitName(String invitName) {
this.invitName = invitName;
}
@Override
public String toString() {
return "Invitation [subject=" + subject + ", holder=" + holder
+ ", holderTime=" + holderTime + ", holderPlace=" + holderPlace
+ ", invitName=" + invitName + "]";
}
}
package com.jelly.mypattern.builder;
import java.io.BufferedReader;
import java.io.FileReader;
/**
* 邀请函的构建者 (生成器) 类
* @author jelly
*
*/
public class InvitationBuilder {
/**
* 根据配置文件,构造出一个邀请函对象
* @param path
* @return
* @throws Exception
*/
public Invitation build(String path) throws Exception{
Invitation invitation=null;
BufferedReader reader=null;
try {
reader=new BufferedReader(new FileReader(path));
String line= reader.readLine();
String[] ss= line.split(",");
invitation=new Invitation();
invitation.setSubject(ss[0]);
invitation.setHolder(ss[1]);
invitation.setHolderTime(ss[2]);
invitation.setHolderPlace(ss[3]);
invitation.setInvitName(ss[4]);
return invitation;
} finally {
reader.close();
}
}
}
第十七届武汉国际汽车展览会,武汉市人民政府和中国国际贸易促进委员会,2016年10月12-17日,武汉国际博览中心,张晓明 #邀请函内容由活动主题 、举办机构/单位、 活动时间、活动地点和被邀请人姓名5个部分组成,各部分间以逗号隔开。
package com.jelly.mypattern.builder;
/**
* 构建者模式 测试类
* @author jelly
*
*/
public class BuilderTest {
/**
* Builder
* 构建者模式:
* 1 将类对象的构建过程单独抽取出来封装,使对象的业务逻辑和对象的构建逻辑分离开。
* 2 当构建对象的逻辑较复杂,且容易发生变动时最好使用构建者模式。
* 3 通用用于读取配置文件、xml文件构建一个对象。
*
*/
public static void main(String[] args) throws Exception {
InvitationBuilder builder=new InvitationBuilder();
String path=BuilderTest.class.getResource("invitation.txt").getPath();
Invitation invitation= builder.build(path);//构建出Invitation类的一个实例
System.out.println(invitation);
}
}
上一篇:java设计模式(一)
下一篇:java设计模式(三)


阅读排行


Copyright © 叮叮声的奶酪 版权所有
备案号:鄂ICP备17018671号-1