场景
我们创建商品
内容
1. 不使用工厂模式设计模式
使用传统new方式创建bean。
public class NonPattern {
public static void main(String[] args) {
//1.我们使用传统方式创建产品
Produnct produnct = new Produnct("苹果");
System.out.println(produnct);
}
/**
* 商品类
*/
public static class Produnct{
private String name;
public Produnct(String name){
this.name = name;
}
//setter getter省略
}
}
2.使用工厂模式设计模式
2.1 逻辑
- 工厂模式创建的对象需要创建某一类产品,不是某一个产品,所以创建对象返回的对象是一个拥有共有特诊的接口。
- 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
- 接口是从多个相似类中抽象出来的规范,接口体现了规范(设计)和实现分离的设计哲学,接口本身并不提供任何实现。
2.2 类图

2.3 代码
public class FactoryPattern {
public static void main(String[] args) {
//1.创建苹果
Product product1 = AppleProductFactory.create();
product1.excute(); //产品:苹果
//2.创建橙子
Product product2 = OrangeProductFactory.create();
product2.excute(); //产品:橙子
}
public interface Product{
void excute();
}
public static class AppleProduct implements Product{
private String name = "苹果";
public void excute() {
System.out.println("产品:"+this.name);
}
}
public static class OrangeProduct implements Product{
private String name = "橙子";
public void excute() {
System.out.println("产品:"+this.name);
}
}
public static class AppleProductFactory{
public static Product create(){
return new AppleProduct();
};
}
public static class OrangeProductFactory{
public static Product create(){
return new OrangeProduct();
};
}
}
3.总结
3.1 不使用设计模式对比
- 直接面向一个类来编程,new来创建类的实例的话,你就是后面会死的很惨;如果我们修改了产品类属性和构造器,那么通过new创建对象将会改变,如果系统通过new创建的对象很多,那么我们每一处都得改动。
- 我们如果对Product,要更换一个类,换一个类的实现;此时就必须在创建这个类实例的地方,都要修改一下这个代码;如果你有1000个地方,都创建了Product这个类的实例;你需要在1000个地方都去修改这个new Product()的这段代码;代码可维护性和可扩展性之差,惨不忍睹,垃圾代码
3.2 不使用设计模式对比
- 如果此时有1000个地方都需要获取Product的实例;但是此时Product实现类改了; 我们只要修改一个地方就是ProductFacory中:create()
- 但是此时客户端调用一直没变味。面向接口编程。
3.3 工厂模式自己的特点
**优点:**1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
**缺点:**每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。