设计模式——工厂模式

在设计模式中,有一种非常经典的设计模式叫工厂模式,常见的工厂模式有以下三种
  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式
 
 
 
一、简单工厂模式
 
1、如上图图所示,创建了service的抽象接口类Shop,定义了Shop的抽象方法sell();
public interface Shop {
 
    public void sell();
}
    
并且在Shop的实现类BookShop、ClothStop、FruitShop中实现了sell()方法。
代码如图所示
 
2、接下来就是创建工厂类,创建一个生产Shop实现类的静态方法,能够根据传入的参数返回不同类型的Shop实现类。
public class ShopFactory {
     
    public static Shop createShop(String shopType){
        if(shopType.equals("fruit")){
            return new FruitShop();
        }
        else if(shopType.equals("cloth")){
            return new ClothesShop();
        }
        else if(shopType.equals("book")){
            return new BookShop();
        }
        else{
            return null;
        }
    }
 
}
 
3、在测试类中测试工厂类的静态生产方法,发现根据传入参数自动生产想要的对象
 
二、工厂方法模式
工厂方法模式是简单工厂模式的进一步抽象化和推广,工厂方法模式里不再只由一个工厂类决定那一个产品类应当被实例化,这个决定被交给抽象工厂的子类去做。接下来上例子
 
 
 
1、如上图所示,在工厂类中抽象出来一个ShopFactory,是所有具体类的抽象工厂的接口
public class FruitFactory implements ShopFactory {
 
    @Override
    public Shop createShop() {
         
        return new FruitShop();
    }
}
 
2、实现了ShopFactory的接口,分别对应Shop的实现类的具体工厂类FuritFactory、ClothesFactory、BookFactory;
3、其他实现与简单工厂模式一致
4、测试类中,首先创建某一个具体Shop类的类工厂对象,调用具体类工厂实现创建 Shop实现类的方法。
public class ShopTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ShopFactory sf = new ClothesFactory();
        Shop shop = sf.createShop();
        shop.sell();
    }
}
.
比起简单类工厂,工厂方法模式会产生更多的工厂对象,因此在实体类较多的时候,应该避免此种方法的使用,而是采用简单工厂和工厂方法结合的模式。
 
 
三、抽象工厂模式
在实际生产中,我们的具体类实现的不可能只有一种接口,而是面向多接口的形式,这种形式我们称之为产品簇。例如,在网上商城中,除了有商城这个形式的类外,商城类还会去关联顾客类。这种关联往往就会产生新的类型需求。
1、如上图所示,创建了一个抽象类工厂接口,定义了抽象方法,并且实现类BookYongFactory实现了这两个方法
  • AbstractFacory
  • import com.factory.service.Custom;
    import com.factory.service.Shop;
     
    public interface AbstractFactory {
        public Shop createShop();
        public Custom createCustom();
     
    }
  • BookYongFactory
  • public class BookYongFactory implements AbstractFactory {
     
        @Override
        public Shop createShop() {
            return new BookShop();
        }
        @Override
        public Custom createCustom(){
            return new YongCustom();
        }
     
    }

     

2、Custom接口定义了buy()的抽象方法,YongCustom实现了这个方法
  • Custom
  • public interface Custom {
     
        public void buy();
    }
  •  YongCustom
  • public class YongCustom implements Custom {
     
        @Override
        public void buy() {
            // TODO Auto-generated method stub
            System.out.println("年轻人买了");
        }
     
    }

     

3、最后在测试类中通过抽象类工厂生产出了两个Shop、Custom的实现类对象,并且成功调用
 
 
四、总结一波
  实际生产中我们也不必过多去纠结使用哪种工厂模式,工厂模式的本质目的是为了解耦。将对象的产生与业务代码分离,更好地管理对象产生过程中的细节。
 
posted @ 2016-11-01 13:24  向向向阳  阅读(261)  评论(0)    收藏  举报