Java Tutorial/Design Pattern/Factory Pattern

Материал из Java эксперт
Перейти к: навигация, поиск

A simple static factory method.

   <source lang="java">

import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; abstract class Shape {

 public abstract void draw();
 public abstract void erase();
 public static Shape factory(String type) {
   if (type.equals("Circle"))
     return new Circle();
   if (type.equals("Square"))
     return new Square();
   throw new RuntimeException("Bad shape creation: " + type);
 }

} class Circle extends Shape {

 Circle() {
 } // Package-access constructor
 public void draw() {
   System.out.println("Circle.draw");
 }
 public void erase() {
   System.out.println("Circle.erase");
 }

} class Square extends Shape {

 Square() {
 } // Package-access constructor
 public void draw() {
   System.out.println("Square.draw");
 }
 public void erase() {
   System.out.println("Square.erase");
 }

} public class ShapeFactory {

 public static void main(String args[]) {
   List<Shape> shapes = new ArrayList<Shape>();
   Iterator it = Arrays.asList(
       new String[] { "Circle", "Square", "Square", "Circle", "Circle", "Square" }).iterator();
   while (it.hasNext())
     shapes.add(Shape.factory((String) it.next()));
   it = shapes.iterator();
   
   while (it.hasNext()) {
     Shape s = (Shape) it.next();
     s.draw();
     s.erase();
   }
 }

}</source>





Creating and Extending Objects with the Factory Patterns

   <source lang="java">

public class MainClass {

 public static void main(String args[]) {
   SecureFactory factory;
   factory = new SecureFactory();
   Connection connection = factory.createConnection("Oracle");
   System.out.println("You"re connecting with " + connection.description());
 }

} class SecureFactory extends ConnectionFactory {

 public Connection createConnection(String type) {
   if (type.equals("Oracle")) {
     return new SecureOracleConnection();
   } else if (type.equals("SQL Server")) {
     return new SecureSqlServerConnection();
   } else {
     return new SecureMySqlConnection();
   }
 }

} abstract class Connection {

 public Connection() {
 }
 public String description() {
   return "Generic";
 }

} abstract class ConnectionFactory {

 public ConnectionFactory() {
 }
 protected abstract Connection createConnection(String type);

} class SqlServerConnection extends Connection {

 public SqlServerConnection() {
 }
 public String description() {
   return "SQL Server";
 }

} class SecureSqlServerConnection extends Connection {

 public SecureSqlServerConnection() {
 }
 public String description() {
   return "SQL Server secure";
 }

} class SecureOracleConnection extends Connection {

 public SecureOracleConnection() {
 }
 public String description() {
   return "Oracle secure";
 }

} class SecureMySqlConnection extends Connection {

 public SecureMySqlConnection() {
 }
 public String description() {
   return "MySQL secure";
 }

}</source>