工厂模式&策略模式。
抽象、封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理。(百度百科)
不断抽象封装,让复杂事物变得简单,以便于让我们的大脑能够进行处理。
我记得有那么一天,小吴带着女朋友去城西银泰买手机,他们走进一家小米手机店,对卖家(seller)说:“给我一部小米的手机看看?”卖家心里想:“废话,在小米店里,我还能卖苹果手机给你啊!直接说手机呀”
在C语言面向过程下,我们编程就是这样的,必须把每一个过程单独出来,但是在面向对象编程中就可以避免。
1、简单工厂模式:我(客户端)不需要直接创建对象,只需要负责消费。面向对象强调的是开闭原则,对扩展开放,对修改关闭。
当我需要买苹果手机的时候,代码是不需要修改的,当我增加一种新手机类型的时候,部分代码需要改动,需要继承Phone类,工厂要增加逻辑的判断。
综上,当具体产品比较少增加,业务比较简单的时候可以用简单工厂模式。
public class WuSimpleFactory {
public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Phone phone = Seller.creatPhone("XiaoMi");
//手机根据类型说不同的话
phone.setName("XiaoMi");
phone.sell();
}
}
//抽象产品
abstract class Phone{
private String name;
public abstract void sell();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
class Apple extends Phone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
//简单工厂
class Seller{
public static Phone creatPhone(String phoneType){
Phone phone = null;
if(phoneType.equals("XiaoMi")){
phone = new XiaoMi();
}
if(phoneType.equals("Apple")){
phone = new Apple();
}
return phone;
}
}
2、工厂模式
我们发现简单工厂模式没有完全符合开闭原则,当增加新的具体产品时,需要修改原先的代码,及工厂模块需要增加逻辑,那么我们可以将工厂也抽象出一个抽象工厂。
相当于,不直接找小米或者苹果的店员,先找他们共同的经理,通过经理去管理各个手机店员就好了。
package com.enjoyor.soa.traffic.server.tms.util;
public class WuSimpleFactory {
public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Seller sell = new XiaoMiSeller();
//手机根据类型说不同的话
Phone phone = sell.creatPhone();
phone.setName("XiaoMi");
phone.sell();
}
}
//抽象产品
abstract class Phone{
private String name;
public abstract void sell();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
class Apple extends Phone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
//工厂
abstract class Seller{
public abstract Phone creatPhone();
}
class XiaoMiSeller extends Seller{
@Override
public Phone creatPhone() {
return new XiaoMi();
}
}
class AppleSeller extends Seller{
@Override
public Phone creatPhone() {
return new Apple();
}}
3、使用工厂模式已经完全符合开闭原则,当增加新的具体产品时不用修改任何原先的代码,只需要分别继承抽象产品类和抽象工厂类即可。基本上能满足大部分的业务需求,但是当手机分型号(产品族)的时候,也就是说,小米手机里面又继续分小米1和小米2的时候,就需要单独定义小米手机的抽象产品里面,用于不同型号的小米手机进行继承。
比如:
//抽象产品
abstract class XiaoMiPhone{
private String name;
public abstract void sell();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//省略
4、策略模式
策略模式和工厂模式十分类似,只是强调的封装不同。
package com.enjoyor.soa.traffic.server.tms.util;
public class WuSimpleFactory {
//策略模式:内行顾客,知道手机的所有细节,已经将手机实例化了,只是需要工厂处理一下
public static void main(String[] args) {
XiaoMiPhone phone = new XiaoMi1();
phone.setName("mi1");
//传进参数是在客户端已经实例化好的实例
phoneContext context = new phoneContext(phone);
context.sell();
}
}
//抽象产品
abstract class XiaoMiPhone{
private String name;
public abstract void sell();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
class XiaoMi2 extends XiaoMiPhone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
//工厂
class phoneContext{
XiaoMiPhone phone = null;
public phoneContext (XiaoMiPhone phone){
this.phone = phone;
}
public void sell(){
this.phone.sell();
}
}
~~~~~~~~~~~~~~~~
package com.enjoyor.soa.traffic.server.tms.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class WuSimpleFactory {
//工厂模式:外行顾客,不知道手机具体,只知道一个手机名字
public static void main(String[] args) throws IOException {
System.out.println("请输入你要购买的手机");
String phoneName = new BufferedReader(new InputStreamReader(System.in)).readLine();
XiaoMiPhone phone = phoneContext.creatPhone(phoneName);
phone.setName("mi1");
phone.sell();
}
}
//抽象产品
abstract class XiaoMiPhone{
private String name;
public abstract void sell();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
class XiaoMi2 extends XiaoMiPhone{
@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}
//工厂
class phoneContext{
public static XiaoMiPhone creatPhone(String type) {
XiaoMiPhone phone = null;
if("mi1".equalsIgnoreCase(type)){ //不区分大小写
phone = new XiaoMi1();
}
if("mi2".equalsIgnoreCase(type)){
phone = new XiaoMi2();
}
return phone;
}
}
文章参考 : http://www.cnblogs.com/ZSG-DoBestMe/p/5175761.html
工厂模式&策略模式。的更多相关文章
- 大话设计模式Python实现-策略模式
策略模式(Strategy Pattern):它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户. 下面是一个商场活动的实现 #!/usr/bin/e ...
- 读《大话设计模式》——应用策略模式的"商场收银系统"(WinForm)
策略模式的结构 这个模式涉及到三个角色: 环境(Context)角色:持有一个 Strategy 类的引用.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现.此角色给出所 ...
- 【转】设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成 ...
- 设计模式:Strategy 策略模式 -- 行为型
设计模式 策略模式Strategy(对象行为型) 这是几年前写的文字(转载做的笔记更准确些),发觉还是废话多了点. 其实,核心就是5.结构中的UML图 5.1 和 5.2(新增).现在看这张图就觉得一 ...
- 设计模式 ( 十八 ) 策略模式Strategy(对象行为型)
设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也经常遇到类似的情况,实现某一个功能有多种算法或者策略,我们能够依据环境或者条件的不同选择不同的算法或者策略来完毕 ...
- Java设计模式6:策略模式
策略模式 策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式是对算法的包 ...
- 设计模式浅谈----策略模式(c#及java实现)
一.何为策略模式 策略模式是行为型模式的一种,主要用于需要使用不同的算法来处理不同的数据对象时使用,是一种可以在运行时选择算法的设计模式.也称为政策模式. 主要解决:在有多种算法相似的情况下,使用 i ...
- 《Head First 设计模式》[01] 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- 简单工厂模式&策略模式-简介与区别
不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...
随机推荐
- C和C指针小记(六)-基本声明、指针声明、typedef 、常量、作用域、链接属性、存储类型、static
1.变量的声明 声明变量的基本形式: 说明符号(一个或者多个) 声明表达式列表 说明符 (specifier) 包含一些关键字,用于描述被声明的标识符的基本类型,它也可用户改变标识符的缺省存储类型和作 ...
- PHP之获取终端用户IP
// function get_real_ip() { $ip=false; $clientip = "clientip"; $xrealip = "xrealip&qu ...
- day4_处理json
说明:#json是一种通用的数据类型,所有的语言都认识.#k - v {}#json串就是一个字符串,不能根据key-value取值#json可以转成字典#json串就是字符串,可放在三引号中校验js ...
- day2_抓包-抓包工具Charles
1.Charles功能简单描述 1)定位问题,前端的.后端的问题 2)发出去的请求,请求头.请求体,返回的数据 3)拦截请求,修改请求 2.Charles抓包(Android手机) 1.要求手机得和你 ...
- springmvc shiro整合cas单点登入
shiro cas分为登入跟登出 maven依赖: <dependency> <groupId>org.apache.shiro</groupId> <art ...
- Shell基本介绍和使用
Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...
- tomcat在Eclipse中和idea中的使用
在eclipse中的使用 下载 http://tomcat.apache.org/ 部署项目到tomcat 常见问题 访问时如何出掉项目名 中文乱码问题 1.浏览器编码问题,修改浏览器的编码 2.js ...
- 图书管理(Loj0034)+浅谈哈希表
图书管理 题目描述 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想要借书的客人快速查找他们是否有他们所需要的书),我们需要设计一个图书查找系统. ...
- 使用IntelliJ IDEA创建Maven聚合工程、创建resources文件夹、ssm框架整合、项目运行一体化
一.创建一个空的项目作为存放整个项目的路径 1.选择 File——>new——>Project ——>Empty Project 2.WorkspaceforTest为项目存放文件夹 ...
- Vue通过build打包后 打开index.html页面是空白的
最近在build打包vue项目遇到了几个问题,如下: 1.npm run build打包项目之后,我们通常是把dist文件里面被压缩后的static文件跟index.html提交到服务器,但最近发现直 ...