工厂模式

来源:互联网 发布:上海交大矩阵理论作业 编辑:程序博客网 时间:2024/06/06 09:23

1类图

这里写图片描述

2定义:

一个用于创建对象的接口,让子类决定实例化那个类

3使用场景

  • 需要生成复杂的对象。
  • 用new就可以创建的对象无需使用工厂模式。

4具体实现

  • 1抽象产品类
public abstract class Product {    public abstract void method();}
  • 2具体产品A类
public class ConcreteProductA extends Product {    @Override    public void method() {        // TODO Auto-generated method stub        System.out.println("A");    }}
  • 3具体产品B类
public class ConcreteProductB extends Product {    @Override    public void method() {        // TODO Auto-generated method stub        System.out.println("B");    }}
  • 4抽象工厂类
public abstract class Factory {    public abstract Product createProduct();    //public abstract<T extends Product> T createProduct(Class<T> clz);}
  • 5具体工厂类
public class ConcreteFactory extends Factory{    @Override    public Product createProduct() {        // TODO Auto-generated method stub        //创建ConcreteProductA();        return new ConcreteProductA();        //return new ConcreteProductB();    }}
  • 客户类
public class Client {    public static void main(String[] args) {        Factory factory = new ConcreteFactory();        Product product = factory.createProduct();        //Product product = factory.createProduct(ConcreteProductB.class);        product.method();    }}

5利用反射的方式决定创建那个产品类的实例

  • 更改抽象工厂类
public abstract class Factory {    //public abstract Product createProduct();    public abstract<T extends Product> T createProduct(Class<T> clz);}
  • 更改具体工厂类
public class ConcreteFactory extends Factory{    @Override    public <T extends Product> T createProduct(Class<T> clz) {        // TODO Auto-generated method stub        Product p = null;        try {            p = (Product) Class.forName(clz.getName()).newInstance();        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return (T)p;    }/*    @Override    public Product createProduct() {        // TODO Auto-generated method stub        //创建ConcreteProductA();        return new ConcreteProductA();        //return new ConcreteProductB();    }*/}
  • 客户类
public class Client {    public static void main(String[] args) {        Factory factory = new ConcreteFactory();        //Product product = factory.createProduct();        Product product = factory.createProduct(ConcreteProductB.class);        product.method();    }}

6每个产品都具体化抽象工厂类

  • 创建产品A的具体工厂类
public class ConcreteFactoryA extends Factory {    @Override    public Product createProduct() {        // TODO Auto-generated method stub        return new ConcreteProductA();    }}
  • 创建产品B的具体工厂类
public class ConcreteFactoryB extends Factory {    @Override    public Product createProduct() {        // TODO Auto-generated method stub        return new ConcreteProductB();    }}
  • 客户类
public class Client {    public static void main(String[] args) {        //Factory factory = new ConcreteFactory();        //Product product = factory.createProduct();        //Product product = factory.createProduct(ConcreteProductB.class);        //product.method();        Factory factory = new ConcreteFactoryA();        Product productA = factory.createProduct();        productA.method();    }}
原创粉丝点击