码迷,mamicode.com
首页 > 其他好文 > 详细

工厂方法模式

时间:2018-05-18 14:03:59      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:接口   new   笔记   alt   cat   tst   创建   常见   nts   

定义

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

使用情景

在任何需要生产复杂的对象的地方都可以使用工厂方法模式。复杂对象适用于使用工厂模式,用new就可以完成创建的对象无需使用工厂模式。

uml图

技术分享图片

产品

抽象产品

/**
 * 抽象产品类
 */
public abstract class Product {
    /**
     * 产品类的抽象方法,
     * 由具体的产品类去实现
     */
    public abstract void method();
}

具体产品A

/**
 * 具体的产品类
 */
public class ConcreteProductA extends Product {
    @Override
    public void method() {
        System.out.println("我是具体的产品 A");
    }
}

具体产品B

/**
 * 具体的产品类
 */
public class ConcreteProductB extends Product {
    @Override
    public void method() {
        System.out.println("我是具体的产品 B");
    }
}

工厂

工厂常用的有三种方式

第一种

工厂

/**
 * 抽象工厂类
 */
public abstract class Factory {
    /**
     * 抽象工厂方法,
     * 又具体的抽象工厂类实现
     */
    public abstract Product createFactory();
}

具体工厂

/**
 * 具体的工厂类:最常见的方式,需要哪个就生产哪个
 */
public class ConcreteFactory extends Factory {

    @Override
    public Product createFactory() {
//        return new ConcreteProductB();
        return new ConcreteProductA();
    }
}

这种工厂模式比较常见,需要哪一个产品就生成哪一个。

第二种

工厂

public abstract class Factory {
    /**
     * 创建产品
     * 具体生产什么由子类去实现
     */
    public abstract <T extends Product> T createProduct(Class<T> clazz);
}

具体工厂

/**
 * 具体工厂类
 */
public class ConcreteFactory extends Factory {
    @Override
    public <T extends Product> T createProduct(Class<T> clazz) {
        Product product = null;
        try {
            product = (Product) Class.forName(clazz.getName()).newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (T) product;
    }
}

这种方式,通过反射方式来更加简洁地生产具体产品对象,这时,需要在工厂方法的参数列表中传入一个Class类来决定是哪一个产品类。

第三种

工厂

/**
 * 抽象工厂类
 */
public abstract class Factory {
    /**
     * 抽象工厂方法,
     * 又具体的抽象工厂类实现
     */
    public abstract Product createFactory();
}

具体工厂

工厂A

public class ConcreteFactoryA extends Factory {
    @Override
    public Product createFactory() {
        return new ConcreteProductA();
    }
}

工厂B

public class ConcreteFactoryB extends Factory {
    @Override
    public Product createFactory() {
        return new ConcreteProductB();
    }
}

这种拥有多个工厂的方式我们称为多工厂方法模式。这种模式,为每一个产品都定义一个具体的工厂。

当我们的工厂只有一个的时候,我们可以简化掉抽象类。将对于的工厂方法修改为静态方法。

public class Factory {
    public static Product createProduct() {
        return new ConcreteProductA();
    }
}

像这种方式我们称为简单工厂模式或静态工厂模式。





工厂方法模式

标签:接口   new   笔记   alt   cat   tst   创建   常见   nts   

原文地址:https://www.cnblogs.com/gxl1995/p/9055241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!