

}
pw.flush();
}
// Метод чтения вектора из символьного потока
public static IVector readVector(Reader in) throws IOException { StreamTokenizer token = new StreamTokenizer(in);
int t = token.nextToken();
IVector v = new Array((t != StreamTokenizer.TT_EOF) ? (int) token.nval : 0);
t = token.nextToken(); try {
for (int i = 0; t != StreamTokenizer.TT_EOF; ++i, t = token.nextToken()) {
if (t == StreamTokenizer.TT_NUMBER) { v.set(i, token.nval);
}
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return v;
}
// Метод установки фабрики векторов
public static void setVectorFactory(VectorFactory arg) { factory = arg;
}
// Ссылка на текущую фабрику векторов
private static VectorFactory factory = new ArrayFactory();
}
Задание №6.
Вклассе Vectors создадим метод public static IVector
createInstance(int n), создающий с помощью текущей фабрики новый экземпляр вектора с указанным размером. В остальных методах класса Vectors заменим прямое создание экземпляров вектора на вызов этого метода (табл. 9).
Таблица 9 — Измененный код vectors/Vectors.java
package vectors;
import java.io.IOException; import java.io.Writer; import java.io.Reader; import java.io.InputStream; import java.io.OutputStream;
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.PrintWriter; import java.io.StreamTokenizer;
public class Vectors {
// Умножение вектора на число
public static IVector mul(IVector array, double number) { int size = array.size();
12

IVector r = createInstance(size); try {
for (int i = 0; i < size; ++i) { r.set(i, array.get(i) * number);
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
// Сложение двух векторов
public static IVector sum(IVector array, IVector arg) throws IncompatibleVectorSizesException {
int size = array.size(); if (size != arg.size()) {
throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());
}
IVector r = createInstance(size); try{
for (int i = 0; i < size; ++i) { r.set(i, array.get(i) + arg.get(i));
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
// Скалярное произведение двух векторов
public static double mul(IVector array, IVector arg) throws IncompatibleVectorSizesException {
int size = array.size(); if (size != arg.size()) {
throw new IncompatibleVectorSizesException("IncompatibleVectorSizesException", array.size(), arg.size());
}
double r = 0; try {
for (int i = 0; i < size; ++i) {
r += array.get(i) * arg.get(i);
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return r;
}
// Метод записи вектора в байтовый поток
public static void outputVector(IVector v, OutputStream out) throws IOException {
DataOutputStream dos = new DataOutputStream(out); int len = v.size();
dos.writeInt(len); try{
for (int i = 0; i < len; ++i) { dos.writeDouble(v.get(i));
}
}
13

catch(Exception e) { System.out.println(e.getMessage());
}
dos.flush();
}
// Метод чтения вектора из байтового потока
public static IVector inputVector(InputStream in) throws IOException { DataInputStream dis = new DataInputStream(in);
int len = dis.readInt();
IVector result = createInstance(len); try {
for (int i = 0; i < len; ++i) { result.set(i, dis.readDouble());
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return result;
}
// Метод записи вектора в символьный поток
public static void writeVector(IVector v, Writer out) throws IOException
{
PrintWriter pw = new PrintWriter(out); int len = v.size();
pw.print(len); try{
for (int i = 0; i < len; ++i) { pw.print(' '); pw.print(v.get(i));
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
pw.flush();
}
// Метод чтения вектора из символьного потока
public static IVector readVector(Reader in) throws IOException { StreamTokenizer token = new StreamTokenizer(in);
int t = token.nextToken();
IVector v = createInstance((t != StreamTokenizer.TT_EOF) ? (int) token.nval : 0);
t = token.nextToken(); try {
for (int i = 0; t != StreamTokenizer.TT_EOF; ++i, t = token.nextToken()) {
if (t == StreamTokenizer.TT_NUMBER) { v.set(i, token.nval);
}
}
}
catch(Exception e) { System.out.println(e.getMessage());
}
return v;
}
// Метод установки фабрики векторов
public static void setVectorFactory(VectorFactory arg) { factory = arg;
}
14