设计模式——工厂模式
2.2 抽象工厂类uml类图:
举例1:简单工厂模式
创建一个Facotry类,提供SendFactory.java,提供produceEmailSender()和produceSmsSender()分别用于创建EmailSender实例对象和SmsSender实例对象。
package com.asiainfo.test.factory2; /** * 生产的工厂类 * @author luke * */ public class SendFactory { //生产emailSender public static Sender produceEmailSender(){ return new EmailSender(); } //生成smsSender public static Sender produceSmsSender(){ return new SmsSender(); } }
定义一个Sender.java接口
package com.asiainfo.test.factory2; /** * * @author hasee * */ public interface Sender { public void send(); }
分别定义EmailSender.java和SmsSender.java用于实现Sender.java接口
EmailSender.java:
package com.asiainfo.test.factory2; /** * 实现sender接口 * @author hasee * */ public class EmailSender implements Sender { @Override public void send() { System.out.println("使用email发送"); } }
SmsSender.java:
package com.asiainfo.test.factory2; /** * 实现sender接口 * @author hasee * */ public class SmsSender implements Sender { @Override public void send() { System.out.println("使用sms发送"); } }
测试类FactoryTest.java
package com.asiainfo.test.factory2; /** * 测试类 * @author luke * */ public class FactoryTest { public static void main(String[] args) { Sender sender = SendFactory.produceEmailSender(); sender.send(); sender = SendFactory.produceSmsSender(); sender.send(); } }
测试结果,控制台打印:
使用email发送
使用sms发送
举例2:抽象工厂模式
1.抽象工厂类AbstractFactory.java
package com.asiainfo.test.factory6; import com.asiainfo.test.factory6.Product; /** * 抽象工厂类 * @author luke * */ public interface AbstractFactory { //生产圣诞系列 public Product createChristProduct(); //生成新系列 public Product createNewYearProduct(); }
2.HatFactory.java,ShoesFactory.java分别是生成帽子和鞋子的工厂类,都实现抽象工厂类。
package com.asiainfo.test.factory6; public class HatFactory implements AbstractFactory { private String color; @Override public Product createChristProduct() { Hat hat = new Hat(); hat.setColor(color); hat.setFestivalClass("圣诞系列"); return hat; } @Override public Product createNewYearProduct() { Hat hat = new Hat(); hat.setColor(color); hat.setFestivalClass("新年系列"); return hat; } public void setColor(String color) { this.color = color; } }
package com.asiainfo.test.factory6; public class ShoesFactory implements AbstractFactory { private String color; //生产圣诞系列鞋子 @Override public Product createChristProduct() { Shoes shoes = new Shoes(); shoes.setColor(color); shoes.setFestivalClass("圣诞系列"); return shoes; } //生成新年系列鞋子 @Override public Product createNewYearProduct() { Shoes shoes = new Shoes(); shoes.setColor(color); shoes.setFestivalClass("新年系列"); return shoes; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
3. 定义产品接口Product.java,并定义Hat.java,Shoes.java分别实现Product.java接口
package com.asiainfo.test.factory6; /** * 产品接口 * Description: * @author lindq3 * @date 下午03:35:42 */ public interface Product { public void operate(); } package com.asiainfo.test.factory6; public class Hat implements Product { private String color;//颜色 private String festivalClass;//节日系列 @Override public void operate() { System.out.println("戴的帽子是"+this.festivalClass+",颜色是" + this.color); } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public void setFestivalClass(String festivalClass) { this.festivalClass = festivalClass; } public String getFestivalClass() { return festivalClass; } } package com.asiainfo.test.factory6; public class Shoes implements Product { private String color;//颜色 private String festivalClass;//节日系列 @Override public void operate() { System.out.println("穿鞋子是"+this.festivalClass+",颜色是" + this.color); } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String getFestivalClass() { return festivalClass; } public void setFestivalClass(String festivalClass) { this.festivalClass = festivalClass; } }
4.测试类:
package com.asiainfo.test.factory6; /** * 测试类 * @author luke * */ public class FactoryTest { public static void main(String[] args) { ShoesFactory shoesFactory = new ShoesFactory(); //设置颜色,并生产对应节日系列的产品 hatFactory.setColor("白色"); Product chrisMaxHat = hatFactory.createChristProduct(); shoesFactory.setColor("红色"); Product newYearShoes = shoesFactory.createNewYearProduct(); //操作 chrisMaxHat.operate(); newYearShoes.operate(); } }
5.测试结果:
戴的帽子是圣诞系列,颜色是白色
穿鞋子是新年系列,颜色是红色
总结:
工厂模式,把类实例的创建权交给工厂类。
有很好的拓展性,如果要生产新的系列的产品,例如衣服,只需要重新定一个ClothFactory和Cloth类,ClothFactory类实现AbstractFactory接口,Cloth类实现Product产品接口,即可,不需要再修改AbstractFactory,拓展性大大提高。
有一个问题:如果我在上面代码的基础上,需要再增加一个中秋节日系列,感觉还是需要对代码进行改动。
posted on 2017-02-04 17:29 lukelin1989 阅读(183) 评论(0) 编辑 收藏 举报