设计模式之工厂模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之工厂模式相关的知识,希望对你有一定的参考价值。

1.创建抽象工厂

package designModel.factoryModel;
//创建一个抽象的工厂,其中定义了一个方法,用来创建商品
public abstract class AbstractFactory {
    public abstract <T extends GoodInterface> T createGood(Class c);
}


2.创建工厂

package designModel.factoryModel;
//这个工厂用来生产对象,用来生产商品
public class Factory extends AbstractFactory {    
    //通过传进来的类名,创建相应的商品
    public  <T extends GoodInterface> T createGood(Class c){
        GoodInterface good=null;
        try {
            good = (GoodInterface) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            System.out.println("创建相应的商品对象异常");
            e.printStackTrace();
        }
        return (T)good;
    }
}

3. 创建商品接口

package designModel.factoryModel;

//定义所有商品共有的方法
public interface GoodInterface {
    //定义商品输出价格的方法
    public void printPrice();
    //定义商品输出商品名字的方法
    public void printName();
}

4.实现商品接口的商品

package designModel.factoryModel;

public class GoodA  implements GoodInterface{

    @Override
    public void printPrice() {
        System.out.println("GoodA price");
    }

    @Override
    public void printName() {
        System.out.println("GoodA name");
    }


}
package designModel.factoryModel;
//定义了商品B
public class GoodB implements GoodInterface{

    public GoodB() {
    }

    @Override
    public void printPrice() {
        System.out.println("GoodB price");
    }

    @Override
    public void printName() {
        System.out.println("GoodB name");
    }

}

4.测试工厂模式

@Test
    public void testAbstractFactory() {
        AbstractFactory abstractFactory;
        try {
            abstractFactory = Factory.class.newInstance();
            GoodInterface goodA = abstractFactory.createGood(GoodA.class);
            goodA.printName();
            goodA.printPrice();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

5.变种

1)、简单工厂模式

与上述的工厂模式的区别,上述工厂模式继承一个抽象类,实现抽象类的方法,来创建商品对象,简单工厂模式继承一个抽象类,而是通过自己的本身的静态方法去创建商品对象,该模式是工厂方法模式的弱化,所以叫简单工厂模式,也叫做静态工厂模式。

a、工厂类

package designModel.factoryModel;
//这个工厂用来生产对象,用来生产商品
public class Factory {    
    //通过传进来的类名,创建相应的商品
    public static <T extends GoodInterface> T createGood(Class c){
        GoodInterface good=null;
        try {
            good = (GoodInterface) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            System.out.println("创建相应的商品对象异常");
            e.printStackTrace();
        }
        return (T)good;
    }

b、测试类

package designModel.factoryModel;

import org.junit.Test;

public class FactoryTest {

    @Test
    public void testFactory() {
        Factory factory;
        try {
            factory = Factory.class.newInstance();
            GoodInterface goodA = factory.createGood(GoodA.class);
            goodA.printName();
            goodA.printPrice();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

 

2)、多工厂类模式

a、工厂类

package designModel.factoryModel;
//创建一个抽象的工厂,其中定义了一个方法,用来创建商品
public abstract class AbstractFactory {
    //public abstract <T extends GoodInterface> T createGood(Class c);
    
    //多工厂模式不需要在createGood方法中传递参数
    public abstract GoodInterface createGood();
}

实现GoodA的工厂,实现GoodB的工厂

package designModel.factoryModel;


public class GoodAFactory extends AbstractFactory {

    @Override
    public GoodInterface createGood() {
        return new GoodA();
    }
}


package designModel.factoryModel;
public class GoodBFactory extends AbstractFactory {

    @Override
    public GoodInterface createGood() {
        return new GoodB();
    }
}

b、测试多工厂

@Test
    public void testMoreAbstractFactory(){
        AbstractFactory abstractFactory;
        try {
            abstractFactory = GoodAFactory.class.newInstance();
            GoodInterface goodA = abstractFactory.createGood();
            goodA.printName();
            goodA.printPrice();
        } catch (InstantiationException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }

 

以上是关于设计模式之工厂模式的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

设计模式之简单工厂模式

设计模式之简单工厂模式

Java代码实现设计模式之工厂模式

设计模式之简单工厂模式

设计模式之工厂模式