建造者模式

一.什么是建造者模式

建造者模式(Builder Pattern)‌又称生成器模式是一种创建型对象设计模式,它允许将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这种模式通过分离构造过程和表示,使得用户只需要通过指定复杂对象的类型和内容就可以构建它们,而无需关心内部的具体构建细节。建造者模式通过创建一个指导者角色(有时也称为指挥者模式)来协调各个建造步骤,确保构建过程的正确性和灵活性。这种模式适用于那些有许多配置选项的对象创建,尤其是当对象的创建过程需要一系列的步骤来完成,并且这些步骤需要按照特定的顺序进行时。

二.建造者模式的类图

其中,Director调用builder实现构建对象。Builder定义要构建对象的方法,ConcreteBuilder实现具体的方法。

三.实例

创建一个建造者模式,实现.html和.txt文件格式编写。

如果向main函数传递txt,则会生成一个.txt格式文件,如果传递参数html就会生成一个.html格式文件。如何传递参数?eclipse传递方式:run->run Configuration->Arguments->设置参数

UML图如下:

其中,makeTitle是用来设置文档标题的,makeString是用来写关键主题内容的,makeItems是用来写文档主要主体部分的。close用于写文档结尾的。Inite用来初始化文档,加载文档。WriteClose用来结束编辑文档。Print用来打印文档。getResault在TextBilder中是为了获取整个写入的文档的,在Htmlbilder中是为了获取文档名称的。

Textbilder运用Stringbuff来存储输入的信息,最后打印在控制台。Htmlbilder运用PrinTwriter将信息写入io1.txt文件中,最后打印在控制台。

Director.java

import java.io.IOException;

public class Director {
private Bilder bilder;
public Director(Bilder bilder) {
	this.bilder=bilder;
}
public void constract() throws IOException {
	bilder.Inite();
	bilder.makeTitle("greeting");
	bilder.makeString("从早上至下午");
	bilder.Items(new String[]{
	"早上好!",
	"下午好!"
	});
	bilder.makeString("晚上");
	bilder.Items(new String[]{
	"晚上好!",
	"晚安!",
	"再见!"
	});
	bilder.clos();
	bilder.writeClose();
	bilder.Print();
}
}

Bilder.java

import java.io.FileNotFoundException;
import java.io.IOException;

public abstract class Bilder {
public abstract void makeTitle(String title);
public abstract void makeString(String s);
public abstract void Items(String []items);
public abstract void clos();
public abstract void Inite() throws FileNotFoundException;
public abstract void writeClose() throws IOException;
public abstract void Print() throws IOException;
}

Htmlbilder.java

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class HtmlBilder extends Bilder{
private String filename;
protected OutputStream os;
protected PrintWriter pw;
protected InputStream is;
protected InputStreamReader isr;
protected BufferedReader br;
	public void Inite() throws FileNotFoundException{
		os=new FileOutputStream("C:\\Users\\吴贤洋\\Desktop\\io1.txt");
		pw=new PrintWriter(os);
		is=new FileInputStream("C:\\Users\\吴贤洋\\Desktop\\io1.txt");
		isr=new InputStreamReader(is);
		br=new BufferedReader(isr);
	}
	public void makeTitle(String title){
		// TODO Auto-generated method stub
		filename=title+".html";
		pw.println("<Html><head><title>"+title+"</title></head><body>");
		pw.println("<h1>"+title+"</h1>");
	}

	@Override
	public void makeString(String s) {
		// TODO Auto-generated method stub
		pw.println("<p>"+s+"</p>");
	}

	@Override
	public void Items(String[] items) {
		// TODO Auto-generated method stub
		pw.println("<ul>");
		for(int i=0;i<items.length;i++) {
			pw.println("<li>"+items[i]+"</li>");
		}
		pw.println("</ul>");
	}

	@Override
	public void clos() {
		// TODO Auto-generated method stub
		pw.println("</body></html>");
		
	}
public String getResult() {
	return filename;
}
public void writeClose() throws IOException {
	 pw.close();
     os.close(); 
}
public void Print() throws IOException {
	  String info=null;
      info=br.readLine();
      while(info!=null){
          System.out.println(info);
          info=br.readLine();
      }               
      br.close();
      isr.close();
      is.close();
}
}

Textbilder.java

import java.io.FileNotFoundException;
import java.io.IOException;

public class TextBilder extends Bilder {
private StringBuffer buffer=new StringBuffer();

@Override
public void makeTitle(String title) {
	// TODO Auto-generated method stub
	buffer.append("================\n");
	buffer.append("["+title+"]");
	buffer.append("\n");
}

@Override
public void makeString(String s) {
	// TODO Auto-generated method stub
	buffer.append('✔'+s+'\n');
}

@Override
public void Items(String[] items) {
	// TODO Auto-generated method stub
	for(int i=0;i<items.length;i++) {
		buffer.append("*"+items[i]+'\n');
	}
	buffer.append("\n");
}

@Override
public void clos() {
	// TODO Auto-generated method stub
	buffer.append("=======================\n");
}
public String getResult() {
	return buffer.toString();
	
}

@Override
public void Inite() throws FileNotFoundException {
	// TODO Auto-generated method stub
	System.out.println("正在编写txt文件。。。\n");
}

@Override
public void writeClose() throws IOException {
	// TODO Auto-generated method stub
	System.out.println("写入完成\n");
}

@Override
public void Print() throws IOException {
	// TODO Auto-generated method stub
}
}

Main.java

import java.io.IOException;

public class Main {
	public static void main(String args[]) throws IOException {
	if(args.length!=1) {
		usage();
		System.exit(0);
	}
	if(args[0].equals("txt")) {
		TextBilder textbilder=new TextBilder();
		Director director=new Director(textbilder);
		director.constract();
		String result=textbilder.getResult();
		System.out.println(result);
	}else if(args[0].equals("html")) {
		HtmlBilder htmlbilder=new HtmlBilder();
		Director director2=new Director(htmlbilder);
		director2.constract();
		String filename=htmlbilder.getResult();
		System.out.println(filename+"文件编写完成");
	}
	else {
		usage();
		System.exit(0);
	}
	}

	private static void usage() {
		// TODO Auto-generated method stub
		System.out.println("usage:java Main txt 编写纯文件文档");
		System.out.println("usage:java Main html 编写纯html文档");
	}
	
}

运行结果:

传入txt参数

2.传入html参数

打开io1.txt就会发现信息已经写入

习题

习题一:

参考答案:

习题二:

参考答案:

这里添加一个GUI编程实现的窗口类concretebilder,继承Bilder类,扮演ConcreteBuilder角色运行效果如下:

concretebilder.java

import javax.swing.*;
import java.awt.event.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.awt.*;
public class concreatebilder extends Bilder implements ActionListener{
private JFrame jframe=new JFrame();
private Box box=new Box(BoxLayout.Y_AXIS);
public void makeTitle(String title)
{	
	jframe.setTitle(title);
}
public void makeString(String str) {
	box.add(new JLabel(str));
}
public void Items(String Items[]) {
	Box innerbox=new Box(BoxLayout.Y_AXIS);
	for(int i=0;i<Items.length;i++) {
		JButton button=new JButton(Items[i]);
		button.addActionListener(this);
		innerbox.add(button);
	}
	box.add(innerbox);
}
public void Inite() throws FileNotFoundException{
	System.out.println("正在初始化\n");
}

	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		System.out.println(e.getActionCommand());
	}

	


	@Override
	public void clos() {
		// TODO Auto-generated method stub
		jframe.getContentPane().add(box);
		jframe.pack();
		jframe .addWindowListener(new WindowAdapter(){
			public void windowclosing(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	public JFrame getresault() {
		return jframe;
	}
	@Override
	public void writeClose() throws IOException {
		// TODO Auto-generated method stub
		System.out.println("写完了\n");
	}

	@Override
	public void Print() throws IOException {
		// TODO Auto-generated method stub
		System.out.println("正在打印\n");
	}
	
}

Main.java

import java.io.IOException;

import javax.swing.JFrame;

public class Main {
	public static void main(String args[]) throws IOException {
		concreatebilder framebilder=new concreatebilder();
		Director director=new Director(framebilder);
		director.constract();
		JFrame frame=framebilder.getresault();
		frame.setVisible(true);
	}
}

习题三:

参考答案:

简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

拓展资料

main函数的args参数实际上是由两个参数组成,分别是argv和argc。argc是一个整数,表示传递给main函数的命令行参数的总数,包括程序本身,当main函数被调用时,操作系统会传递命令行参数给这个函数,argc就是来记录这些参数的数量。特别的,当argc等于1时表示只有一个程序名称,此时存储在argv中。

argv是一个char*类型的指针数组,数组里面的元素都是char*类型。每个元素指向一个命令行参数,这些参数由空格分隔。argv长度是argc,下标从0开始,其中argv指向程序运行时的全路径名,

argv1指向程序运行时的第一个字符串,以此类推。注意:argv[argc]为NULL,即数组的最后一个元素是一个空指针。

百度百科:

Java中有这样一条语句:public static void main(String[] args)。其中的args是Java命令行参数,我们在DOS中执行Java程序的时候使用“java 文件名 args参数”。args这个数组可以接收到这些参数。

linux 下php程序传值时通过此函数获取值

main(argc,argv)

int argc,char *argv[];

从函数参数的形式上看,包含一个整型和一个指针数组。当一个C的源程序经过编译链接后,会生成扩展名为.EXE可执行文件,这是可以在操作系统下直接运行的文件,换句话说,就是由系统来启动运行的。对main()函数既然不能由其它函数调用和传递参数,就只能由系统在启动运行时传递参数了。

在操作系统环境下,一条完整的运行命令应包括两部分:命令与相应的参数。其格式为:命令参数1参数2....参数

此格式也称为命令行。命令行中的命令就是可执行文件的文件名,其后所跟参数需用空格分隔,并为对命令的进一步补充,也即是传递给main()函数的参数。

命令行与main()函数的参数存在如下的关系:设命令行为:program str1 str2 str3 str4 str5

其中program为文件名,也就是一个由program.c经编译链接后生成的可执行文件program.exe,其后各跟5个参数。对main()函数来说,它的参数argc记录了命令行中命令与参数的个数,共6个,指针数组的大小由参数argc的值决定,即为char*argv[6],指针数组的取值情况。

数组的各指针分别指向一个字符串。应当引起注意的是接收到的指针数组的各指针是从命令行的开始接收的,首先接收到的是命令,其后才是参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值