设计模式(5)简单工厂,工厂方法,抽象工厂

一.简单工厂模式

1.设计思路

建立一个工厂类,对实现统一接口的类进行实例的创建。实质就是由工厂类根据传入的参数,动态的决定应该创建哪个实例类接口


2.缺点

(1)集中了所有实例的创建逻辑,违背了高内聚责任分配原则

(2)如果要添加新的类,就需要修改工厂类,违背开放-关闭原则


3.代码实现

(1)人类

/**
 * 产品的抽象接口  人类
 * @author liaowp
 *
 */
public interface Human {
    
    public void say();

}

(2)男人 女人

public class Man implements Human {

    /* say method
     * @see com.roc.factory.Human#say()
     */
    @Override
    public void say() {
        System.out.println("男人");
    }

}public class Woman implements Human {

    /* say method
     * @see com.roc.factory.Human#say()
     */
    @Override
    public void say() {
        System.out.println("女人");
    }

}

(3)工厂

public class SampleFactory1 {
    public static Human makeHuman(Class c){
        Human human = null;
        try {
            human = (Human) Class.forName(c.getName()).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            System.out.println("不支持抽象类或接口");
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("没有足够权限,即不能访问私有对象");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("类不存在");
            e.printStackTrace();
        }    
        return human;
    }
}



二.工厂方法模式

1.设计思想

    工厂方法模式,又称为工厂模式,通过定义工厂父类负责定义创建对象的公共接口,而子类主要负责生成具体的对象,将类的实例化延迟到工厂类的子类中创建,即由子类来决定实例化哪个类



2优缺点

    优点:解耦,提高了可扩展性

    缺点:

    (1)添加新的产品时,还需要添加对应的具体工厂类,系统中类的数目增加,增加了系统的复杂性

    (2)一个具体的工厂只能创建一种具体产品

3.代码实现

(1)创建抽象产品类,定义产品的公共接口

abstract class Product{
    public abstract void Show();
}

(2)创建抽象工厂类,定义工厂的公共接口

abstract class Factory{
    public abstract Product Manufacture();
}

(3)创建产品实例,生产具体的产品

//具体产品A类
class  ProductA extends  Product{
    @Override
    public void Show() {
        System.out.println("生产出了产品A");
    }
}

//具体产品B类
class  ProductB extends  Product{

    @Override
    public void Show() {
        System.out.println("生产出了产品B");
    }
}

(4)创建具体工厂类,定义创建具体产品实例的方法

//工厂A类 - 生产A类产品
class  FactoryA extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductA();
    }
}

//工厂B类 - 生产B类产品
class  FactoryB extends Factory{
    @Override
    public Product Manufacture() {
        return new ProductB();
    }
}

(5)外界调用不同工厂类的方法,创建不同的具体的产品实例

//生产工作流程
public class FactoryPattern {
    public static void main(String[] args){
        //客户要产品A
        FactoryA mFactoryA = new FactoryA();
        mFactoryA.Manufacture().Show();

        //客户要产品B
        FactoryB mFactoryB = new FactoryB();
        mFactoryB.Manufacture().Show();
    }
}

三 .抽象工厂模式

1.设计思想

    为一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类

    与工厂方法模式的区别是:工厂方法模式针对的是一个产品等级结构,抽象工厂模式针对的是多个产品等级结构

 (比如工厂方法模式-A工厂生产阿迪,耐克...的裤子,B工厂生产耐克,阿迪...的衣服)

 (抽象工厂模式-A生产阿迪的衣服,裤子..,B工厂生产耐克的衣服,裤子...)


2.优缺点

    (1)优点:除了工厂方法的好处外,最主要的优点是在类内部对产品族的关联关系进行定义和描述

    (2)缺点:产品族新增一个新产品,所有的工厂类都需要改变

3.代码实现

(1)产品接口

  interface IProduct1 {
        public void show();
    }
    interface IProduct2 {
        public void show();
    }

(2)产品实现

   class Product1 implements IProduct1 {
        public void show() {
            System.out.println("这是1型产品");
        }
    }
    class Product2 implements IProduct2 {
        public void show() {
            System.out.println("这是2型产品");
        }
    }

(3)工厂接口

  interface IFactory {
        public IProduct1 createProduct1();
        public IProduct2 createProduct2();
    }

(4)工厂实现

 class Factory implements IFactory{
        public IProduct1 createProduct1() {
            return new Product1();
        }
        public IProduct2 createProduct2() {
            return new Product2();
        }
    }

    public class Client {
        public static void main(String[] args){
            IFactory factory = new Factory();
            factory.createProduct1().show();
            factory.createProduct2().show();
        }
    }


猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80992173