设计模式---工厂方法模式 迷南。 2021-09-30 07:18 334阅读 0赞 工厂方法模式(别名:虚拟构造):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 Factory Method使一个类的实例化延迟到其子类。 工厂方法模式属于创建型模式,结构中包括抽象产品、具体产品、构造者和具体构造者四种角色 * 抽象产品( Product):抽象类或接口,负责定义具体产品必须实现的方法。 * 具体产品( ConcreteProduct):如果 Product是一个抽象类,那么具体产品是Product的子类;如果 Product是一个接口,那么具体产品是实现 Product接口的类。 * 构造者( Creator):一个接口或抽象类。构造者负责定义一个被称为工厂方法的抽象方法,该方法返回具体产品类的实例。 * 具体构造者( ConcreteCreator):如果构造者是抽象类,具体构造者是构造者的子类;如果构造者是接口,具体构造者是实现构造者的类。具体构造者重写工厂方法,使该方法返回具体产品的实例。 问题:用户希望自己的圆珠笔能使用不同颜色的笔芯 1:抽象产品 得到一个类的子类的实例最常见的方法就是使用new运算符和该子类的构造方法,但是在某些情况下,用户可能不应该或无法使用这种方法来得到一个子类的实例,其原因是系统不允许用户代码和该类的子类形成耦合或者用户不知道该类有哪些子类可以使用。 工厂方法模式的关键是在一个接口或抽象类中定义一个抽象方法,该方法返回某个类的子类的实例 //抽象产品 //笔芯--该类的子类可以提供相应颜色的笔芯 public abstract class PenCore{ String color; public abstract void writeWord(String s); } 2:具体产品(这里只写一个) //红色的笔芯 public class RedPenCore extends PenCore{ RedPenCore(){ color="红色"; } public void writeWord(String s){ System.out.println("写出"+color+"的字:"+s); } } public class BluePenCore extends PenCore{ BluePenCore(){ color="蓝色"; } public void writeWord(String s){ System.out.println("写出"+color+"的字:"+s); } } 3:构造者 //构造者 //负责定义一个被称为工厂方法的抽象方法,该方法要求返回具体产品类的实例 public abstract class PenCoreCreator{ public abstract PenCore getPenCore(); //工厂方法 } 4:具体构造者(只写二个) //该方法返回具体产品的实例 public class RedCoreCreator extends PenCoreCreator{ //使用抽象产品类声明的方法,返回类型是它的实例,不过PenCore是抽象类,那就不能返回它的实例了,所这 //里返回的是它的子类的实例 public PenCore getPenCore() { //重写工厂方法 return new RedPenCore(); } public class BlueCoreCreator extends PenCoreCreator{ public PenCore getPenCore() { //重写工厂方法 return new BluePenCore(); } } 5:用户只需要知道抽象产品有哪些方法就行,不用知道有哪些具体产品 圆珠笔使用工厂方法得到笔芯 //圆珠笔 public class BallPen{ PenCore core; public void usePenCore(PenCore core){ this.core=core; } public void write(String s) { core.writeWord(s); } } 6:主函数 public class Application{ public static void main(String args[]){ // 笔芯构造者;具体构造者引用赋给构造者,上转型 PenCoreCreator creator=new RedCoreCreator(); // 笔芯;使用工厂方法返回笔芯实例new RedPenCore(红色) PenCore penCore = creator.getPenCore(); // 圆珠笔 BallPen ballPen=new BallPen(); //用户不用知道所使用的对象,比如pencore是怎么创建的,只有知道它有什么方法就行了 ballPen.usePenCore(penCore); ballPen.write("你好,很高兴认识你"); creator =new BlueCoreCreator(); penCore = creator.getPenCore(); ballPen.usePenCore(penCore); ballPen.write("nice to meet you"); } } 工厂方法模式的优点: (1)使用工厂方法可以让用户的代码和某个特定类的子类的代码解耦。 (2)工厂方法使用户不必知道它所使用的对象是怎样被创建的,只需知道该对象有哪些方法即可。 适合使用工厂方法模式的情景如下: (1)用户需要一个类的子类的实例,但不希望该类的子类形成耦合。 (2)用户需要一个类的子类的实例,但用户不知道该类有哪些子类可用。 * 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。 * 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。 * 客户不关心创建产品的细节,只关心产品的品牌。
还没有评论,来说两句吧...