工厂方法模式的概述和使用 工厂方法模式概述 工厂方法模式中抽象工厂类负责定义创建对象的借口,具体对象的创建工作由继续抽象工厂的具体类实现。
优点
客户端不需要再负责对象的创建,从而明确了各个类的职责
如果有新的对象增加,只需要维护一个具体的类和具体的工厂类即可,不影响已有的代码
后期维护容易,曾倩了系统的扩展性
缺点
需要额外的编写代码,增加了工作量
示例演示
工厂方法模式中抽象工厂负责定义创建对象的接口。
创建 AnimalFactory 接口:
1 2 3 4 5 6 package com.enjoyms.Factory;public interface AnimalFactory { public Animal createAnimal () ; }
创建 Animal 抽象类:
1 2 3 4 5 6 package com.enjoyms.Factory;public abstract class Animal { public abstract void eat () ; }
创建 Dog 类:
1 2 3 4 5 6 7 8 9 10 package com.enjoyms.Factory;public class Dog extends Animal { @Override public void eat () { System.out.println("吃狗粮" ); } }
创建 Pig 类:
1 2 3 4 5 6 7 8 9 package com.enjoyms.Factory;public class Pig extends Animal { @Override public void eat () { System.out.println("吃猪粮" ); } }
创建狗工厂实现类 DogFactory:
1 2 3 4 5 6 7 8 9 package com.enjoyms.Factory;public class DogFactory implements AnimalFactory { @Override public Animal createAnimal () { Dog dog = new Dog(); return dog; } }
创建猪工厂实现类 PigFactory:
1 2 3 4 5 6 7 8 9 package com.enjoyms.Factory;public class PigFactory implements AnimalFactory { @Override public Animal createAnimal () { Pig pig = new Pig(); return pig; } }
Main 方法进行对象创建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.enjoyms.Factory;public class Main { public static void main (String[] args) { Dog dog = new Dog(); dog.setName("阿黄" ); dog.setColor("黄色" ); Pig pig = new Pig(); pig.setName("佩奇" ); pig.setColor("粉色" ); dog.eat(); pig.eat(); System.out.println("-----------" ); DogFactory dogFactory = new DogFactory(); Dog dog1 = (Dog) dogFactory.createAnimal(); PigFactory pigFactory = new PigFactory(); Pig pig1 = (Pig) pigFactory.createAnimal(); dog1.eat(); pig1.eat(); } }
在 Animal 类中添加两个属性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package com.enjoyms.Factory;public abstract class Animal { private String name; private String color; public abstract void eat () ; public String getName () { return name; } public void setName (String name) { this .name = name; } public String getColor () { return color; } public void setColor (String color) { this .color = color; } }
如果需要多次创建对象那么每次都需要手动设置属性,并且无法做到改一处达到所有地方都修改,所以可以把属性交给工厂来做,修改 DogFactory 和 PigFactory:
1 2 3 4 5 6 7 8 9 10 11 package com.enjoyms.Factory;public class DogFactory implements AnimalFactory { @Override public Animal createAnimal () { Dog dog = new Dog(); dog.setColor("黄色" ); dog.setName("小黄" ); return dog; } }
PigFactory 略。
这样还会存在一个问题,就是必须 new 出对应的工厂,然后调用方法进行对象获取。
简单工厂模式 简单工厂模式概述
又称静态工厂方法模式,它定义一个具体的工厂类负责创建一些类的实例
优点
客户端不需要再负责对象的创建,从而明确了各个类的职责
缺点
这个静态工厂类负责所有对象的创建,如果有新的对象增加,或者某些对象的创建方式不同,就需要不断的修改工厂类,不利于后期维护
示例演示
创建 AnimalFactory 静态工厂类 AnimalFactoryStatic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package com.enjoyms.Factory;public class AnimalFactoryStatic { public static Dog createDog () { Dog dog = new Dog(); return dog; } public static Pig createPig () { Pig pig = new Pig(); return pig; } }
通过简单工厂模式创建对象:
1 2 3 Dog dog3 = AnimalFactoryStatic.createDog(); Pig pig3 = AnimalFactoryStatic.createPig();