一、介绍
程序的设计来源生活,面向对象的程序语言更是如此。
举个例子:我们要生产一件衣服,一双鞋子等等,而他们都属于穿戴物品,有共同
还可以应付,但要是需要创建大量的物品呢,是不是太麻烦?为了简化操作,我们会
造一个工厂,来大量的生产我们想要的物品。
二、作用
凡是出现了大量的产品需要创建,并且具有共同的接口时,可以通过工厂方法模式进行创建。
三、实现
需求:我们需要生产衣服、鞋子
1、首先他们有一个共同的属性:颜色
/**
* 父类穿戴
* @author jztx
*
*/
interface Wear
{
public void color();
}
2、衣服和鞋子需要实现这个接口
/**
* 需要制造的衣服类
* @author BeiKe
*
*/
class Clothes implements Wear
{
@Override
public void color() {
System.out.println("我是白色的!");
}
}
/**
* 需要制造的鞋子类
* @author BeiKe
*
*/
class Shoes implements Wear
{
@Override
public void color() {
System.out.println("我是黑色的!");
}
}
3、我们知道要创建什么东西了,这时我们需要建立一个工厂来生产这些东西
/**
* 创建一个工厂,需要制造很多这些衣服
* @author BeiKe
*
*/
class Factory
{
/**
* 返回一件衣服
* @return
*/
public static Wear factoryMakeClothes()
{
return new Clothes();
}
/**
* 返回一双鞋子
* @return
*/
public static Wear factoryMakeShoes()
{
return new Shoes();
}
}
4、现在我们可以开始生产东西了
/**
* 设计模式-工厂模式
* @param args
*/
public static void main(String[] args) {
Factory.factoryMakeClothes().color();
Factory.factoryMakeShoes().color();
}
这样我们就可以随心所欲的生产这两个物品了。
但是这样创建就会出现一个问题,我们的工厂就只能生产衣服和鞋子,但要是某一
天我们需要裤子怎么办呢?这就需要改动工厂,这很明显不符合面向对象设计封装的思
想,所以我们需要对这个工厂做出改进。
代码:
/**
* 我们抽象化一个工厂,里面就只有制造一个方法
* @author jztx
*
*/
interface Factory
{
public Wear make();
}
/**
* 我们再实现这个工程里面的方法,具体化制造什么
* @author jztx
*
*/
class FactoryMakeClothes implements Factory
{
@Override
public Wear make() {
return new Clothes();
}
}
class FactoryMakeShoes implements Factory
{
@Override
public Wear make() {
return new Shoes();
}
}
再调用:
/**
* 设计模式-工厂模式
* @param args
*/
public static void main(String[] args) {
new FactoryMakeClothes().make().color();
new FactoryMakeShoes().make().color();
}
就这样我们可以随意的添加制造的东西。