设计模式

1 工厂模式

【实验内容和要求】
  有一个OEM制造商代理做HP笔记本电脑(Laptop),后来该制造商得到了更多的品牌笔记本电脑的订单Acer,Lenovo,Dell,该OEM商发现,如果一次同时做很多个牌子的本本,有些不利于管理。利用工厂模式改善设计,用JAVA语言实现 (或C#控制台应用程序实现)该OEM制造商的工厂模式。绘制该模式的UML图。
【模式UML图】
在这里插入图片描述
【模式代码(JAVA语言实现)】
在这里插入图片描述

public class FactoryMethod {
	public static void main(String[] args) {
		Computer c = null;
		Factory f = null;
		f = new DellFactory();
		c = f.getComputerType();
		c.ComputerType();
		f = new LenovoFactory();
		c = f.getComputerType();
		c.ComputerType();
		f = new AcerFactory();
		c = f.getComputerType();
		c.ComputerType();
	}
}
 
interface Factory{
	Computer getComputerType();
}
 
class DellFactory implements Factory{
 
	@Override
	public Computer getComputerType() {
		return new Dell();
	}
}
 
class AcerFactory implements Factory{
 
	@Override
	public Computer getComputerType() {
		return new Acer();
	}
}
 
class LenovoFactory implements Factory{
 
	@Override
	public Computer getComputerType() {
		return new Lenovo();
	}
}
 
interface Computer{
	public void ComputerType();
}
 
class Dell implements Computer{
 
	@Override
	public void ComputerType() {
		System.out.println("Dell Computer");
		
	}
	
}
 
class Acer implements Computer{
 
	@Override
	public void ComputerType() {
		System.out.println("Acer Computer");
		
	}
	
}
 
class Lenovo implements Computer{
 
	@Override
	public void ComputerType() {
		System.out.println("Lenovo Computer");
		
	}
	
}

【运行截图】
在这里插入图片描述

四、心得体会:

通过本次实验,学会了使用工厂方法模式。工厂方法模式的适用性如下:
当一个类不知道它所必须创建的对象的类时。
当一个类希望由他的子类来指定它所创建的对象时。
当类创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个帮助子类时代理这一信息局部化时。

2 抽象工厂模式

【实验内容和要求】
麦当劳(McDonalds)和肯德基(KFC)快餐店都经营汉堡(Hamburg)和可乐(Cole),用JAVA语言实现(C#控制台应用程序实现)这两个快餐店经营产品的抽象工厂模式。绘制该模式的UML图。
【模式UML图】
在这里插入图片描述

【模式代码】

AbstractFactoryTest
public class AbstractFactoryTest {
    public static void main(String[] args) {
        Hamburg hamburg;
        Cola cola;
        AbstractFactory abstractFactory = new MDLFactory();
        hamburg = abstractFactory.createHamburg();
        cola = abstractFactory.createCola();
        hamburg.getHamburg();
        cola.getCola();

        abstractFactory = new KFCFactory();
        hamburg = abstractFactory.createHamburg();
        cola = abstractFactory.createCola();
        hamburg.getHamburg();
        cola.getCola();
    }
}

public interface Hamburg {
    void getHamburg();
}

public interface Cola {
    void getCola();
}

public interface AbstractFactory {
    Hamburg createHamburg();
    Cola  createCola();
}

public class MDLCola implements Cola {
    @Override
    public void getCola() {
        System.out.println("这是麦当劳的可乐");
    }
}

public class MDLFactory implements AbstractFactory{
    @Override
    public Hamburg createHamburg() {
        return new MDLHamburg();
    }

    @Override
    public Cola createCola() {
        return new MDLCola();
    }
}

public class MDLHamburg implements Hamburg {

    @Override
    public void getHamburg() {
        System.out.println("这是麦当劳的汉堡包");
    }
}

public class KFCFactory implements AbstractFactory{
    @Override
    public Hamburg createHamburg() {
        return new KFCHamburg();
    }

    @Override
    public Cola createCola() {
        return new KFCCola();
    }
}

public class KFCHamburg implements Hamburg {
    @Override
    public void getHamburg() {
        System.out.println("这是肯德基的汉堡包");
    }
}

public class KFCCola implements Cola {
    @Override
    public void getCola() {
        System.out.println("这是肯德基的可乐");
    }
}



【运行截图】
在这里插入图片描述

【实验小结】
抽象工厂模式主要适用于以下情况:
一系列要独立于它的产品的创建、组合和表示时。、
一个系统要由多个产品系列中的一个来配置时。
当要强调一系列相关的产品对象的设计以便进行联合使用时。
当要提供一个产品类库,而只要显示它们的接口而不是实现时。

3 建造者模式

实例:KFC套餐
建造者模式可以用于描述KFC如何创建套餐:套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁、可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。利用建造者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
【模式UML图】
在这里插入图片描述
【模式代码(JAVA语言实现)】
在这里插入图片描述

//客户端
public class Client {
    public static void main(String[] args) {
        //动态确定套餐种类
        MealBuilder mb = (MealBuilder) XMLUtil.getBean();
        //服务员是指挥者
        KFCWaiter waiter = new KFCWaiter();
        //服务员准备套餐
        waiter.setMealBuilder(mb);
        //客户获得套餐
        Meal meal = waiter.construct();

        System.out.println("套餐组成:");
        System.out.println(meal.getFood()+"   "+meal.getDrink());

    }
}

//抽象类
public abstract class MealBuilder {
    protected Meal meal=new Meal();
    public abstract void buildFood();
    public abstract void buildDrink();
    public Meal getMeal(){
        return meal;
    }
}

public class Meal {
    //food和Drink是部件
    private String food;
    private String drink;

    public String getFood() {
        return food;
    }

    public void setFood(String food) {
        this.food = food;
    }

    public String getDrink() {
        return drink;
    }

    public void setDrink(String drink) {
        this.drink = drink;
    }
}

public class KFCWaiter {
    private MealBuilder mb;

    public void setMealBuilder(MealBuilder mb) {
        this.mb = mb;
    }

    public Meal construct(){
        mb.buildFood();;
        mb.buildDrink();
        return mb.getMeal();
    }
}

public class SubMealBuilderA extends MealBuilder {
    @Override
    public void buildFood() {
        meal.setFood("一个鸡腿堡");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("一杯可乐");
    }
}

public class SubMealBuilderB extends MealBuilder{

    @Override
    public void buildFood() {
        meal.setFood("一个鸡肉卷");
    }

    @Override
    public void buildDrink() {
        meal.setDrink("一杯果汁");
    }
}
package softwaredesign.three;

import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
public class XMLUtil
{
	//该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象
	public static Object getBean()
	{
		try
		{
			//创建文档对象
			DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = dFactory.newDocumentBuilder();
			Document doc;
			//这里填自己的config.xml路径
			doc = builder.parse(new File("D:\\learningappDataSave\\JAVA\\src\\softwaredesign\\three\\config.xml"));

			//获取包含类名的文本节点
			NodeList nl = doc.getElementsByTagName("className");
			Node classNode=nl.item(0).getFirstChild();
			String cName=classNode.getNodeValue();

			//通过类名生成实例对象并将其返回
			Class c=Class.forName(cName);
			Object obj=c.newInstance();
			return obj;
		}
		catch(Exception e)
		{
			e.printStackTrace();
			return null;
		}
	}
}

<?xml version="1.0"?>
xml文件:
<config>
	<className>SubMealBuilderA</className> 错误写法
    <className>softwaredesign.three.SubMealBuilderA</className> 正确写法,全类名=包名+类名
</config>

【运行截图】
在这里插入图片描述
在这里插入图片描述
【实验小结】
通过本次实验,学会了使用建造者模式。建造者模式的适用性如下:
1.关注按照步骤创建一个复杂的对象
2.将所建造的产品最后一次性返回,而不是一点一点地返回

4 单例模式

【实验内容和要求】
在操作系统中,打印池(Print Spooler)是一个用于管理打印任务的应用程序,通过打印池用户可以删除、中止或者改变打印任务的优先级,在一个系统中只允许运行一个打印池对象,如果重复创建打印池则抛出异常。现使用单例模式来模拟实现打印池的设计。用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。
【模式UML图】
在这里插入图片描述
【模式代码】



package softwaredesign.four;
import java.util.Scanner;

/**
 * @Author cyh
 * @Date 2021/6/18 18:12
 */
public class PrintSpoolerMain {
    private static Scanner sc;

    public static void main(String[] args) {
        System.out.println("打印。。。");

        try {
            System.out.println("选择操作:");
            System.out.println(" D ――Delete");   //删除任务
            System.out.println(" S ――Suspension");  //中止任务
            System.out.println(" C ――Change priorities");   //改变任务优先级
            System.out.println(" E ――Exit");  //退出

            sc = new Scanner(System.in);
            while (true) {
                switch (sc.next()) {
                    case "D":
                        PrintSpoolerSingleton DeletePrint = PrintSpoolerSingleton.getInstance("Delete");
                        DeletePrint.manageJobs();
                        break;
                    case "S":
                        PrintSpoolerSingleton SuspensionPrint = PrintSpoolerSingleton.getInstance("Suspension");
                        SuspensionPrint.manageJobs();
                        break;
                    case "C":
                        PrintSpoolerSingleton ChangePrioritiesPrint = PrintSpoolerSingleton.getInstance("Change priorities");
                        ChangePrioritiesPrint.manageJobs();
                        break;
                    case "E":
                        System.exit(1);
                        break;
                    default:
                        break;
                }
            }
        } catch (Exception e) {

        }
    }
}

package softwaredesign.four;

/**
 * @Author cyh
 * @Date 2021/6/18 18:06
 */
public class PrintSpoolerSingleton {
    private static PrintSpoolerSingleton instance;
    private String name;

    private PrintSpoolerSingleton(String name) {
        this.name = name;
    }

    public static PrintSpoolerSingleton getInstance(String name) {
        if (instance == null && !name.equals(null)) {
            instance = new PrintSpoolerSingleton(name);
        }
        return instance;
    }

    public void manageJobs() {
        System.out.println(name+"...");
    }
}

package softwaredesign.four;

/**
 * @Author cyh
 * @Date 2021/6/18 18:24
 */
public class PrintSpoolerException {
    public PrintSpoolerException(String message){
        System.out.println(message);
    }
}


【运行截图】
在这里插入图片描述
四、心得体会:

要求生产唯一序列号。

WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。

创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。

当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

5 组合模式

【实验内容和要求】

文件浏览

文件有不同类型,不同类型的文件其浏览方式有所区别,如文本文件和图片文件的浏览方式就不相同。对文件夹的浏览实际上就是对其中所包含文件的浏览,而客户端可以一致地对文件和文件夹进行操作,无须关心它们的区别。使用组合模式来模拟文件的浏览操作。利用组合者模式设计,用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。

【模式UML图】在这里插入图片描述

【模式代码(JAVA语言实现)】

public abstract class AbstractFile {

    public abstract void add(AbstractFile element);

    public abstract void remove(AbstractFile element);

    public abstract void display();

}

public class Folder extends AbstractFile{
    private String fileName;
    private ArrayList fileList = new ArrayList();

    public Folder(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element) {
        fileList.add(element);
        System.out.println("Folder:add");
    }

    @Override
    public void remove(AbstractFile element) {
        fileList.remove(element);
        System.out.println("Folder:remove");
    }

    @Override
    public void display() {
        for (Object object : fileList) {
            ((AbstractFile)object).display();
        }
        System.out.println("Folder:display");
    }
}

public class ImageFile extends AbstractFile{
    private String fileName;

    public ImageFile(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element) {
        System.out.println("ImageFile:add");
    }

    @Override
    public void remove(AbstractFile element) {
        System.out.println("ImageFile:remove");
    }

    @Override
    public void display() {
        System.out.println(fileName);
        System.out.println("ImageFile:display");
    }
}

public class TextFile extends AbstractFile{
    private String fileName;

    public TextFile(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element) {
        System.out.println("TextFile:add");
    }

    @Override
    public void remove(AbstractFile element) {
        System.out.println("TextFile:remove");
    }

    @Override
    public void display() {
        System.out.println(fileName);
        System.out.println("TextFile:display");
    }
}

public class VideoFile extends AbstractFile{
    private String fileName;

    public VideoFile(String fileName) {
        this.fileName = fileName;
    }

    @Override
    public void add(AbstractFile element) {
        System.out.println("VideoFile:add");
    }

    @Override
    public void remove(AbstractFile element) {
        System.out.println("VideoFile:remove");
    }

    @Override
    public void display() {
        System.out.println(fileName);
        System.out.println("VideoFile:display");
    }
}

public class Client {
    public static void main(String[] args) {
        //定义抽象类
        AbstractFile obj1,obj2,obj3,obj4,obj5;
        //定义几个文件夹
        Folder plate1,plate2,plate3;

        //建文件
        obj1 = new ImageFile("iii");
        obj2 = new TextFile("ttt");
        obj3 = new VideoFile("vvv1");
        obj4 = new VideoFile("vvv2");
        obj5 = new VideoFile("vvv3");
        //建文件夹
        plate1 = new Folder("fff1");
        plate2 = new Folder("fff2");
        plate3 = new Folder("fff3");


        //将文件加入文件夹1
        plate1.add(obj1);
        plate1.add(obj2);

        //将文件3,4加入问价夹2
        plate2.add(obj3);
        plate2.add(obj4);

        //将文件夹1以及文件夹2和文件5加入文件夹3
        plate3.add(plate1);
        plate3.add(plate2);
        plate3.add(obj5);

        plate3.display();
    }
}

【运行截图】
在这里插入图片描述

心得体会:

组合模式的适用性如下:

(1)在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。
(2)在一个使用面向对象语言开发的系统中需要处理一个树形结构。
(3)在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

6 适配器模式

【实验内容和要求】

加密适配器

某系统需要提供一个加密模块,将用户信息(如密码等机密信息)加密之后再存储在数据库中,系统已经定义好了数据库操作类。为了提高开发效率,现需要重用已有的加密算法,这些算法封装在一些由第三方提供的类中,有些甚至没有源代码。使用适配器模式设计该加密模块,实现在不修改现有类的基础上重用第三方加密方法。

现使用适配器模式来模拟实现打印池的设计。用JAVA语言实现(C#控制台应用程序实现)该模式。绘制该模式的UML图。

【模式UML图】
在这里插入图片描述
【模式代码(JAVA语言实现)】

public abstract class DataOperation {
    public abstract String doEncrypt(String ps);
}
public class Caesar {
    public String doEncrypt(String ps){
        return "原来的加密方法加密后的密码为:"+ps;
    }
}
public class NewCaesar {
    public String doEncrypt(String ps){
        ps="new"+ps;
        return "新方法加密后的密码为:"+ps;
    }
}

public class CipherAdapter extends DataOperation{
    private Caesar cipher;

    public CipherAdapter() {
        cipher=new Caesar();
    }

    @Override
    public String doEncrypt(String ps) {
        return cipher.doEncrypt(ps);
    }
}

public class NewCipherAdapter extends DataOperation{
    private NewCaesar newCipher;

    public NewCipherAdapter() {
        newCipher=new NewCaesar();
    }

    @Override
    public String doEncrypt(String ps) {
        return newCipher.doEncrypt(ps);
    }
}


public class Client {
    public static void main(String[] args) {
        String s1 = "123456";
        String s2 = "";

        DataOperation data = null;

        data=new CipherAdapter();
        s2 = data.doEncrypt(s1);
        System.out.println(s2);

        data = new NewCipherAdapter();
        s2 = data.doEncrypt(s1);
        System.out.println(s2);
    }
}

【运行截图】在这里插入图片描述
在这里插入图片描述
四、心得体会:

适配器模式主要适用于以下情况:
1)统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
2)创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抽象工厂模式(Abstract Factory Pattern) 引入: 在前面介绍的两个创建型模式里面,我们解决的都是有关"new"的问题,用它们来避免显式指定类创建对象。我写的也非常简单易懂,相信看过的朋友们都应该对简单工厂模式、工厂方法模式的意图、所能解决的问题及适用情景有一定的了解了。但是若要达到灵活运用,什么时候用,怎样用合适还不是看一篇文章就能解决的问题。呵呵..这需要你对OO的理解程度,你的项目开发经验等等许多方面的积累。一起努力喔。。 好了,咱们言归正传,通过对这两个模式的了解,我们掌握一种思想,就是在创建一个对象时,需要把容易发生变化的地方给封装起来,来控制变化(哪里变化,封装哪里),以适应客户的变动,项目的扩展。但是,我们在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作,同时由于需求的变化,这“一系列相互依赖的对象”也要改变,如何应对这种变化呢?如何像简单工厂模式、工厂方法模式一样绕过常规的"new",然后提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?可能有人会说,你也可以将这些对象一个一个通过工厂方法模式来解决呀?但是,我们试想,既然是一系列相互依赖的对象,它们是有联系的,每个对象都这样解决,你又如何来保证他们的联系呢?举一个例子:Windows桌面主题,当你一个桌面主题的时候,系统的开始按钮、任务栏、菜单栏、工具栏等等都变了,而且是一起变的,他们的色调都还很一致,难道类似这样的问题,怎么来解决呢?它的天敌就是抽象工厂模式。 意图: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 参考者: 也就是该模式中的各个类或对象之间的关系: 抽象工厂(Abstract Factory) 声明生成一系列抽象产品的方法 具体工厂(Concrete Factory) 执行生成一系列抽象产品的方法,生成一系列具体的产品 抽象产品(Abstract Product) 为这一系列的某一种产品声明接口 具体产品(Product) 定义具体工厂生成的具体产品的对象,实现产品接口 客户(Client) 我们的应用程序客户端(不要理解成人),使用抽象产品和抽象工厂生成对象。 抽象工厂模式UML图 抽象工厂模式在生活中的实例 咱们继续拿怎么穿衣服来说明这个抽象工厂模式。 就拿你来说吧。工作了,为了参加一些聚会,肯定有两套或多套衣服吧,比如说有商务装(成套,一系列具体产品)、时尚装(成套,一系列具体产品),甚至对于一个家庭来说,可能有商务女装、商务男装、时尚女装、时尚男装,这些也都是成套的,即一系列具体产品。咱们假设一种情况(现实中是不存在的,要不然,没法进入共产主义了,但有利于说明抽象工厂模式),在你的家中,某一个衣柜(具体工厂)只能存放某一种这样的衣服(成套,一系列具体产品),每次拿这种成套的衣服时也自然要从这个衣柜中取出了。用OO的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子(另一个抽象产品)。 分析: 要好好去读上面那个实例,虽然有点绕嘴,其实只要用心去读,分清了抽象工厂模式的各个角色,对理解设计模式是非常重要的。理解头绪,然后接合简单工厂模式、工厂方法模式对工厂家族的了解,再加上抽象工厂模式的意图,头脑中差不多有一个雏型了吧。好了,咱们一起来分析一下。。 先把各个角色揪出来。 抽象工厂:虚拟的衣柜,它只是个概念而已。在项目中可能是一个接口或抽象类,定义规则,取出上衣,裤子。 具体工厂:具体的存在的衣柜,它用于存放某一种成套的衣服,换句话说,这种成套的衣服都是从这个衣柜中取出的。在项 目中继承于抽象工厂,实现抽象工厂中的方法,取出具体产品,某一件上衣,某一条裤子。 抽象产品:虚拟的衣服,也只是个概念。在项目中可能是多个接口或抽象类,定义规则,有什么特性,起什么作用。 具体产品:具体的实际存在的产品,它指的就是用于组装成某一套衣服的某一件上衣或裤子。它继承自某一个抽象产品。实 现抽象产品中制定的规则,特性。 它们之间怎么联系呢?客户在用的时候,依赖的又是什么呢? 客户在要的时候,首先要说出你要的什么系列的衣服,然后根据它的要求生成一个具体工厂的实例,剩下的工作就都是这个倒霉的具体工厂了,它会根据自己的实现生成一个上衣,生成一个裤子,然后把它交给客户。客户在这一过程中并不知道具体工厂都了什么。也就是说,客户只依赖于抽象工厂和抽象产品了。在初始化的时候会用到一次具体工厂类名,我们根据.NET特有的反射机制又可以把这个在客户端唯一的具体的非抽象类放到一个应用程序配置文件中,防止它变化。 这就符合了设计模式中的“开放--封闭”原则,依赖倒转原则,里氏代换原则等等。 具体代码如下: 抽象工厂角色: 1namespace AbstractFactory 2{ 3 //抽象工厂类, 4 public abstract class AbstractClothes 5 { 6 //抽象方法:创建一个上衣 7 abstract public AbstractCoat CreateCoat(); 8 //抽象方法:创建一个裤子 9 abstract public AbstractTrousers CreateTrousers(); 10 } 11} 12 抽象产品角色: 1namespace AbstractFactory 2{ 3 /**//// <summary> 4 /// 抽象产品----上衣抽象类 5 /// </summary> 6 public abstract class AbstractCoat 7 { 8 //性别属性 9 public abstract bool Sex 10 { 11 get; 12 } 13 14 //样式属性 15 public abstract string Style 16 { 17 get; 18 } 19 } 20 21 /**//// <summary> 22 /// 抽象产品----裤子抽象类 23 /// </summary> 24 public abstract class AbstractTrousers 25 { 26 //性别属性 27 public abstract bool Sex 28 { 29 get; 30 } 31 32 //样式属性 33 public abstract string Style 34 { 35 get; 36 } 37 } 38} 39 具体工厂角色: 1namespace AbstractFactory 2{ 3 /**//// <summary> 4 ///时尚男装 5 /// </summary> 6 public class FashionManClothes:AbstractClothes 7 { 8 public override AbstractFactory.AbstractCoat CreateCoat() 9 { 10 return new CoatA(); 11 } 12 13 public override AbstractTrousers CreateTrousers() 14 { 15 return new TrousersA(); 16 } 17 } 18 19 /**//// <summary> 20 /// 时尚女装 21 /// </summary> 22 public class FashionWomanClothes : AbstractClothes 23 { 24 public override AbstractCoat CreateCoat() 25 { 26 return new CoatB(); 27 //throw new Exception("The method or operation is not implemented."); 28 } 29 public override AbstractTrousers CreateTrousers() 30 { 31 return new TrousersB(); 32 //throw new Exception("The method or operation is not implemented."); 33 } 34 } 35} 具体产品角色:(注意:我并没有把所有的具体产品类都列出来,由于简单,可以推想出剩余的产品类,详见附件) 1namespace AbstractFactory 2{ 3 /**//// <summary> 4 /// 时尚男性上衣 5 /// </summary> 6 public class CoatA:AbstractFactory.AbstractCoat 7 { 8 private bool sex = true; 9 private string style = "时尚"; 10 /**//// <summary> 11 /// 重写基类的Sex属性 12 /// </summary> 13 public override bool Sex 14 { 15 get 16 { 17 return sex; 18 } 19 } 20 21 /**//// <summary> 22 /// 重写基类的Style属性 23 /// </summary> 24 public override string Style 25 { 26 get 27 { 28 return style; 29 } 30 } 31 } 32 33 /**//// <summary> 34 /// 时尚男性裤子 35 /// </summary> 36 public class TrousersA : AbstractTrousers 37 { 38 private bool sex = true; 39 private string style = "时尚"; 40 public override bool Sex 41 { 42 get 43 { 44 return sex; 45 } 46 } 47 public override string Style 48 { 49 get 50 { 51 return style; 52 } 53 } 54 } 55} 客户端代码: 1namespace AbstractFactory 2{ 3 /**//// <summary> 4 /// 创建衣服类 5 /// </summary> 6 public class CreateClothes 7 { 8 private AbstractCoat myCoat; 9 private AbstractTrousers myTrousers; 10 public CreateClothes(AbstractClothes clothes) 11 { 12 myCoat = clothes.CreateCoat(); 13 myTrousers = clothes.CreateTrousers(); 14 } 15 16 public void ShowMyClothes() 17 { 18 Console.WriteLine("My Clothes:"); 19 string sex= myCoat.Sex ? "男" : "女"; 20 //Console.WriteLine("Coat:{0} {1}", myCoat.Sex ? "男" : "女", myCoat.Style); 21 Console.WriteLine("Coat:{0} {1}", sex, myCoat.Style); 22 sex=myTrousers.Sex?"男":"女"; 23 Console.WriteLine("Trousers:{0} {1}", sex, myTrousers.Style); 24 } 25 } 26 27 28 public class Client 29 { 30 static void Main(string[] args) 31 { 32 //创建一个工厂类的实例 33 string assemblyName = ConfigurationManager.AppSettings["assemblyName"]; 34 string fullTypeName =string.Concat( ConfigurationManager.AppSettings["nameSpaceName"] ,".", ConfigurationManager.AppSettings["typename"]); 35 36 AbstractClothes factory = (AbstractClothes)Assembly.Load(assemblyName).CreateInstance(fullTypeName); 37 CreateClothes clothes = new CreateClothes(factory); 38 clothes.ShowMyClothes(); 39 Console.Read(); 40 } 41 } 42} 43 app.config文件 1<configuration> 2 <appSettings> 3 <!--一般情况下只需改第三个"typename"就行了,具体工厂类 --> 4 <add key="assemblyName" value="ConcreteFactory"/> 5 <add key="nameSpaceName" value="AbstractFactory"/> 6 <add key="typename" value="FashionManClothes"/> 7 </appSettings> 8</configuration>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值