工厂模式

来源:互联网 发布:淘宝怎么捡漏 编辑:程序博客网 时间:2024/06/08 19:40

1:概述

        工厂模式:主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

        工厂模式分类:1)简单工厂模式(Simple Factory);2)工厂方法模式(Factory Method);3)抽象工厂模式(Abstract Factory)。这三种模式从上到下逐步抽象,并且更具一般性。

        将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。

2:区别  

        工厂方法模式:一个抽象产品类,可以派生出多个具体产品类;一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。

        抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类可以创建多个具体产品类的实例。

        区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个;工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

3:代码实现

1:简单工厂模式Coding:

        一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象接口的实现类。

//抽象类接口:动物interface Animal {public void say();}//实现接口:狗class Dog implements Animal {@Overridepublic void say() {System.out.println("汪汪汪");}}//实现接口:猫class Cat implements Animal {@Overridepublic void say() {System.out.println("喵喵喵");}}//动物工厂class AnimalFactory {////使用 getAnimalSay 方法获取Animal类型的对象public Animal getAnimalSay(String animalType){if(animalType==null){return null;}if(animalType.equalsIgnoreCase("Dog")){return new Dog();}else if(animalType.equalsIgnoreCase("Cat")){return new Cat();}return null;}}//工厂测试方法public class SimpleFactoryTest {public static void main(String[] args) {AnimalFactory animalFactory = new AnimalFactory();//获取Dog对象并调用它的say()方法Animal animal1 = animalFactory.getAnimalSay("Dog");animal1.say();//获取Cat对象并调用它的say()方法Animal animal2 = animalFactory.getAnimalSay("Cat");animal2.say();}}

2:工厂方法模式Coding:

        工厂方法模式是对简单工厂方法模式的改进,在简单工厂方法模式中,如果传入的字符串出错或者没有,则简单工厂模式是不能创建对象的。而工厂方法模式是提供了多个工厂方法并分别创建对象。即有四个角色:抽象工厂模式、具体工厂模式、抽象产品模式、具体产品模式;不再是由一个工厂类去实例化具体的动物,而是由抽象工厂的子类去实例化动物。

//抽象类接口:动物interface Animal {public void say();}//实现抽象类接口:猫class Cat implements Animal {@Overridepublic void say() {System.out.println("喵喵喵");}}//实现抽象类接口:狗class Dog implements Animal {@Overridepublic void say() {System.out.println("汪汪汪");}}//抽象的动物工厂abstract class AnimalFactory {public abstract Animal create();}//具体子工厂实例化:猫class CatFactory extends AnimalFactory {@Overridepublic Animal create() {return new Cat();}}//具体子工厂实例化:狗class DogFactory extends AnimalFactory {@Overridepublic Animal create() {return new Dog();}}//工厂测试方法public class FactoryPatternTest {public static void main(String[] args) {AnimalFactory catFactory = new CatFactory();Animal animal1 = catFactory.create();animal1.say();AnimalFactory dogFactory = new DogFactory();Animal animal2 = dogFactory.create();animal2.say();}}

3:抽象工厂模式

        抽象工厂和工厂方法模式很相似,工厂方法模式几乎已经很完美的对对象的创建进行了包装,使得测试类中仅仅处理抽象产品角色提供的接口,但是使得对象的数量成倍增长,当产品种类非常多时,会出现大量的与之对象的工厂对象,这是我们不希望看到的,即工厂方法模式有一个问题为类的创建依赖工厂类,即,如果想拓展程序增加一种产品,就必须要对工厂类进行修改,这违背了设计模式的闭包原则,所以从设计角度考虑,有一定的问题。解决的方法就是抽象工厂模式,工厂模式中工厂只能生产单一的产品,而抽象工厂模式的工厂可以生产多个产品。利用抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能时,直接增加新的工厂类就可以了,不需要修改之前的代码。注:抽象工厂至少需要两个不同的产品种类。

        百科:每当抽象产品都有多于一个的具体子类的时候(Coding Demo:人有两名,动物有两只),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(动物有两个具体类型:Dog and Cat)。抽象工厂模式提供两个具体工厂角色(Factory1和Factory2),分别对应于这两个具体产品角色,每一个具体工厂角色只负责一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

//抽象接口人interface Person {public void say();}//实现人的接口:Peterclass Peter implements Person{@Overridepublic void say() {System.out.println("I am Peter.");}}//实现人的接口:Roseclass Rose implements Person{@Overridepublic void say() {System.out.println("I am Rose.");}}//抽象接口动物interface Animal {public void say();}//实现动物接口:猫class Cat implements Animal {@Overridepublic void say() {System.out.println("喵喵喵");}}//实现动物接口:狗class Dog implements Animal{@Overridepublic void say() {System.out.println("汪汪汪");}}//抽象工厂abstract class AbstractFactory {public abstract Animal createAnimal();public abstract Person createPerson();}//实例化Rose和她猫class Factory1 extends AbstractFactory {@Overridepublic Animal createAnimal() {return new Cat();}@Overridepublic Person createPerson() {return new Rose();}}//实例化Peter和他的狗class Factory2 extends AbstractFactory{@Overridepublic Animal createAnimal() {return new Dog();}@Overridepublic Person createPerson() {return new Peter();}}//抽象工厂测试public class AbstractFactoryTest {public static void main(String[] args) {//Rose和她的猫Factory1 factory1 = new Factory1();Person person1 = factory1.createPerson();Animal animal1 = factory1.createAnimal();person1.say();animal1.say();//Peter和他的狗Factory2 factory2 = new Factory2();Person person2 = factory2.createPerson();Animal animal2 = factory2.createAnimal();person2.say();animal2.say();}}

原创粉丝点击